نمط متعدد الطبقات
في هندسة البرمجيات ، يُعد نمط التعدد نمط تصميم يُعمم نمط المفرد . فبينما يسمح نمط المفرد بإنشاء نسخة واحدة فقط من الفئة، يسمح نمط التعدد بإنشاء نسخ متعددة بشكل مُتحكم فيه، ويتم ذلك من خلال استخدام خريطة .
بدلاً من وجود نسخة واحدة لكل تطبيق (مثل java.lang.Runtimeالكائن في لغة برمجة جافا )، يضمن نمط multiton بدلاً من ذلك وجود نسخة واحدة لكل مفتاح .
لا يظهر نمط التعدد بشكل صريح كنمط في كتاب البرمجة الكائنية المرموق Design Patterns . [ 1 ] ومع ذلك، يصف الكتاب استخدام سجل من الكائنات الفردية للسماح بتصنيف الكائنات الفردية إلى فئات فرعية، [ 2 ] وهو في جوهره نمط التعدد.
وصف
رغم أن مفهوم "المتعدد" قد يبدو ظاهريًا كجدول تجزئة مع وصول متزامن، إلا أن هناك فرقين جوهريين. أولًا، لا يسمح "المتعدد" للعملاء بإضافة تعيينات. ثانيًا، لا يُرجع "المتعدد" أبدًا مرجعًا فارغًا أو معدومًا؛ بل يُنشئ ويخزن نسخة منه عند أول طلب باستخدام المفتاح المرتبط. وتُعيد الطلبات اللاحقة التي تحمل نفس المفتاح النسخة الأصلية. يُعد جدول التجزئة مجرد تفصيل تنفيذي، وليس الأسلوب الوحيد الممكن. يُسهّل هذا النمط استرجاع الكائنات المشتركة في التطبيق.
بما أن مجموعة الكائنات يتم إنشاؤها مرة واحدة فقط، كونها عضوًا مرتبطًا بالفئة (بدلاً من المثيل)، فإن الكائن متعدد الوحدات يحتفظ بسلوكه المسطح بدلاً من أن يتطور إلى بنية شجرية .
يتميز نموذج التخزين المتعدد (multington) بكونه يوفر وصولاً مركزياً إلى دليل واحد (أي أن جميع المفاتيح موجودة في نفس نطاق الأسماء ) يحتوي على نسخ متعددة، حيث يمكن أن توجد كل نسخة متعددة في المجموعة بحالتها الخاصة . وبهذه الطريقة، يدعم هذا النموذج التخزين المفهرس للكائنات الأساسية للنظام (كما هو الحال في نظام LDAP ، على سبيل المثال). مع ذلك، يقتصر استخدام نموذج التخزين المتعدد على نظام واحد فقط بدلاً من استخدامه في عدد كبير من الأنظمة الموزعة.
العيوب
هذا النمط، مثل نمط Singleton ، يجعل اختبار الوحدة أكثر صعوبة بكثير، [ 3 ] لأنه يُدخل حالة عامة في التطبيق.
مع اللغات التي تعتمد على جمع البيانات المهملة، قد يصبح ذلك مصدراً لتسرب الذاكرة لأنه يُدخل مراجع قوية عالمية للكائنات.
التطبيقات
في لغة جافا، يمكن تطبيق نمط التعدد باستخدام نوع مُعدّد ، حيث تتوافق قيم هذا النوع مع مثيلات الكائنات. أما في حالة النوع المُعدّد ذي القيمة الواحدة، فيُنتج ذلك نمط الكائن الأحادي.
في لغة C#، يمكننا أيضًا استخدام التعدادات، كما يوضح المثال التالي:
namespace Wikipedia.Examples ;باستخدام System ؛ باستخدام System.Collections.Generic ؛نوع البيانات العامة متعدد الأنواع { صفر ، واحد ، اثنان }public class Multiton { private static readonly Dictionary < MultitonType , Multiton > instances = new ();نوع MultitonType خاص ؛private Multiton ( MultitonType type ) { this . type = type ; }public static Multiton GetInstance ( MultitonType type ) { // تهيئة كسولة (غير آمنة للاستخدام المتزامن كما هي مكتوبة) // يُنصح باستخدام قفل التحقق المزدوج إذا كنت بحاجة إلى أمان متزامن if ( ! instances . TryGetValue ( type , out Multiton instance )) { instance = new ( type );instances.Add ( type , instance ) ; }أعد النسخة ؛ }public override string ToString () { return $"My type is {this.type}" ; }// مثال على الاستخدام public static void Main ( string [] args ) { Multiton m0 = Multiton . GetInstance ( MultitonType . Zero ); Multiton m1 = Multiton . GetInstance ( MultitonType . One ); Multiton m2 = Multiton . GetInstance ( MultitonType . Two );Console.WriteLine ( m0 ) ; Console.WriteLine ( m1 ) ; Console.WriteLine ( m2 ) ; } }مراجع
- ↑ أودوشيرتي، مايك (2005). التحليل والتصميم الموجهان للكائنات: فهم تطوير الأنظمة باستخدام UML 2.0 . تشيتشستر: وايلي. ص 341. ISBN 0470092408.
- ↑ أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . بوسطن، ماساتشوستس. ميونيخ: أديسون-ويسلي. 2011. ص 130. ISBN 0-201-63361-2.
- ↑ "محادثات حول الكود النظيف - الحالة العالمية والوحدات الفردية" .
روابط خارجية
- أنماط تصميم البرمجيات
