يمكن لنمط التصميم البرمجي مجمع الكائنات Object pool أن يؤمّن دَفعة كبيرة للأداء ، ويكون أكثر فعالية في الحالات التي تكون فيها كلفة بدء عينة من الصنف Class instance مرتفعة، أو ترتفع فيها نسبة استهلال الأصناف مع انخفاض عدد العيّنات المستخدمة في آن واحد.
المشكلة
تستخدم مجمعات الكائنات (والتي تعرف أيضا باسم مجمعات المصادر Resources pools) لإدارة تخبئة الكائنات Object caching. يستطيع العميل الذي يملك وصولا إلى مجمع الكائنات أن يتجنب إنشاء كائنات جديدة بسؤال المجمع عوضا عن ذلك عن كائن سبق استهلاله. ينشئ المجمع كائنات جديدة إذا كان فارغًا وينمو حجمُه، إلّا أنه من الممكن تقييد عدد الكائنات المُنشَأة.
يُفضَّل أن توضَع جميع الكائنات التي تمكن إعادة استخدامها Reusable objects، غير المستخدمة حاليًّا؛ ضمن مجمع الكائنات نفسه، حتى يصبح بالإمكان إدارتها بطريقة متناسقة. يُتوَصَّل إلى هذا الغرض باستخدام نمط الصنف المنفرد Singleton لتصميم الصنف القابل لإعادة الاستخدام.
المناقشة
يسمح مجمع الكائنات للعميل بـ”استعارة” الكائنات الموجودة فيه. يعيد العملاء الكائنات بعد استخدامها إلى المجمع، الذي يمكنه بعد ذلك إعارتها لعميل آخر ليستخدمها بدوره. إلا أننا لا نريد أن ينتظر عميلٌ إعادةَ كائن مستخدَم، فهذا مخالف للرغبة في تحسين اﻷداء؛ لذا فإن مجمع الكائنات يمكنه أن يستهل كائنات جديدة عندما تظهر الحاجة إليها، لكنْ يجب عليه أيضا أن يستخدم وسيلة لتنظيف الكائنات غير المستخدمة دوريّا.
الهيكلية
يقوم المبدأ العامّ لنمط مجمع الكائنات على أنه عند وجود عيّنات من صنف مّا، قابلة لإعادة الاستخدام فإنه من الأفضل تفادي إنشاء كائنات جديدة واستخدام العيّنات الموجودة.
تظهر في المخطّط التالي ثلاثةُ أصناف:
-
الصّنف
Reusable
: تتعاون الكائنات من هذا الصّنف مع بقيّة الكائنات (الكائنات العميلة المذكورة أدناه) لمدّة محدودة، تصبح بعدها كائنات الصّنفReusable
غير ضروريّة لعمل العملاء. -
الصّنف
Client
: تستخدم الكائنات التي تلعب دور العميل عيّنات من الكائنات القابلة لإعادة الاستخدام +(أي كائنات الصّنفReusable
المذكور في النقطة اﻷولى). -
الصّنف
ReusablePool
: تُدير الكائنات من هذا الصنف كائناتٍ قابلةً لإعادة الاستخدام (دور الصّنفReusable
) وتوفّرها للكائنات العميل +(الصّنفClient
).
ينبغي الانتباه هنا إلى أن الأصناف المذكورة أعلاه تمثّل أدوارا Roles، إذ يمكن أن يوجد أكثر من مجمع كائنات (الصّنف ReusablePool
)، ولكلّ مجمع أصناف Reusable
خاصّة به يوفّرها للعملاء الذين يطلُبون ذلك. يمكن لنفس العميل أن يطلُب خِدمات مجمعَيْ كائنات أو أكثر في نفس الوقت.
يُفضل عادة أن يُحتَفَظ بجميع الكائنات القابلة لإعادة الاستخدام غير المُستخدَمة حاليا ضمن مجمع الكائنات نفسه، حتى يصبح بالإمكان إدارتها بسياسة متناسقة واحدة. لهذا الغرض، يُصمَّم الصّنف ReusablePool
ليكون صنفا فريدا، توابعه المشيّدة Constructors خاصّة ممّا يُجبر الأصناف العميلة على استدعاء التابع getInstance
للحصول على عيّنة من الصّنف ReusablePool
.
يستدعي الكائن العميل Client
، عندما يحتاج لعيّنة من الصّنف القابل لإعادة الاستخدام، التابعَ acquireReusable
الذي يوفّره الصّنف ReusablePool
. يحتفظ كائن ReusablePool
مجموعة من الكائنات القابلة لإعادة الاستخدام Reusable
غير المستخدمة حاليا.
ينظُر كائن ReusablePool
عند استدعاء التابع acquireReusable
في مجموعة كائنات Reusable
التي يحتفظ بها، ويحذف منها كائنا ويعيده إلى العميل الذي طلب ذلك. إذا كان المجمع فارغا فإن التابع acquireReusable
ينشئ - إن استطاع - كائنا جديدا. إن لم يستطع التابع acquireReusable
إنشاء كائن جديد فإنه ينتظر أن يُرجِع أحد الكائنات العميلة كائنَ Reusable
.
يمرّر الكائنُ العميل كائنَ الصّنف Reusable
عند انتهائه من استخدامه إلى التابع releaseReusable
الذي يوفّره كائن الصّنف ReusablePool
. يعيد التابعُ releaseReusable
الكائنَ الذي تلقّاه من العميل إلى مجمع كائنات Reusable
غير المستخدمة.
تقيّد كثير من التطبيقات التي تستخدم نمط التصميم مجمع الكائنات، لأسباب مختلفة، عددَ كائنات الصنف Reusable
التي يمكن تواجدها. يكون كائن ReusablePool
الذي ينشئ كائنات Reusable
مسؤولا في هذه الحالة من احترام هذا الشرط. تتوفّر كائنات ReusablePool
- في حالة تقييد عدد الكائنات - على تابع لتحديد عدد كائنات Reusable
الذي لا ينبغي تجاوزه. يظهر هذا التابع في المخطَّط أعلاه باسم setMaxPoolSize
.
قائمة التدقيق
تأكّد عند استخدام نمط التصميم مجمع الكائنات من:
- إنشاء صنف مجمع الكائنات بمصفوفة خاصة من اﻷصناف القابلة لإعادة الاستخدام داخله.
- إنشاء تابعَي طلب الكائنات وتحريرها ضمن صنف مجمع الكائنات.
- استخدام نمط الصّنف المنفرد Singleton لتطبيق مجمع الكائنات.
ترجمة - بتصرّف - للمقال Object Pool Design Pattern لأصحابه Alexander Shvets ،Gerhard Frey وMarina Pavlova.
حقوق الصورة البارزة محفوظة لـ Freepik
أفضل التعليقات
لا توجد أية تعليقات بعد
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.