الفرق بين المراجعتين لصفحة: «Design Patterns/singleton»

من موسوعة حسوب
إدخال 1.0: عنوان الصفحة
 
2.0 محتوى
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:نمط المفردة}}</noinclude>
<noinclude>{{DISPLAYTITLE:نمط المفردة}}</noinclude>
نمط '''المفردة (Singleton)''' هو نمط تصميم إنشائي يضمن وجود نسخة واحدة فقط من فئة ما في نفس الوقت الذي يوفر فيه نقطة وصول عامة لهذه النسخة.
== المشكلة ==
يحل نمط المفردة مشكلتين في نفس الوقت مخالفًا بذلك مبدأ المسؤولية الواحدة:
'''أولًا''': ضمان وجود نسخة واحدة فقط من فئة ما. لمض قد يرغب أحدهم في التحكم في عدد نسخ فئة بعينها؟ أحد أكثر الأسباب انتشارًا لذلك هو التحكم في صلاحية الوصول إلى بعض المصادر المشتركة، كقاعدة بيانات أو ملف مثلًا. إليك فكرة عملها: تخيل أنك أنشأت كائنًا ما، لكن بعد فترة قررت أن تنشئ واحدًا جديدًا، فبدلًا من استلام كائن جديد، تحصل على الكائن الذي أنشأته مسبقًا. لاحظ أن هذا السلوك يستحيل استخدامه مع المنشئ العادي (regular constructor) بما أن استدعاء المنشئ يجب أن يعيد دائمًا كائنًا جديدًا.
'''ثانيًا''': توفير نقطة وصول عامة إلى تلك النسخة. ربما تكون المتغيرات العامة التي كنت تستخدمها لتخزين بعض الكائنات الضرورية مفيدة، لكنها غير آمنة بما أنك أي شيفرة قد تغي محتويات تلك المتغيرات وتتسبب في انهيار التطبيق. ويسمح لك نمط المفردة هنا -تمامًا كالمتغير العام (Global Variable)- بالوصول إلى بعض الكائنات من أي مكان في البرنامج، لكنه يحمي تلك النسخة من تغيير محتواها من قِبل الشيفرات الأخرى. وهناك جانب آخر من المشكلة: أنت لا تريد للشيفرة التي تحل مشكلة 1# مثلًا من الانتشار في برنامجك كله، فمن الأفضل وضعها داخل فئة واحدة، خاصة إن كانت بقية شيفرتك تعتمد عليها من قبل.
وقد صار نمط المفردة مشهورًا هذه الأيام إلى حد أن الناس قد تطلق اسم المفردة على شيء ما قد يحل مشكلة واحدة فقط من المشاكل المذكورة.
== الحل ==

مراجعة 02:47، 12 يناير 2019

نمط المفردة (Singleton) هو نمط تصميم إنشائي يضمن وجود نسخة واحدة فقط من فئة ما في نفس الوقت الذي يوفر فيه نقطة وصول عامة لهذه النسخة.

المشكلة

يحل نمط المفردة مشكلتين في نفس الوقت مخالفًا بذلك مبدأ المسؤولية الواحدة:

أولًا: ضمان وجود نسخة واحدة فقط من فئة ما. لمض قد يرغب أحدهم في التحكم في عدد نسخ فئة بعينها؟ أحد أكثر الأسباب انتشارًا لذلك هو التحكم في صلاحية الوصول إلى بعض المصادر المشتركة، كقاعدة بيانات أو ملف مثلًا. إليك فكرة عملها: تخيل أنك أنشأت كائنًا ما، لكن بعد فترة قررت أن تنشئ واحدًا جديدًا، فبدلًا من استلام كائن جديد، تحصل على الكائن الذي أنشأته مسبقًا. لاحظ أن هذا السلوك يستحيل استخدامه مع المنشئ العادي (regular constructor) بما أن استدعاء المنشئ يجب أن يعيد دائمًا كائنًا جديدًا.

ثانيًا: توفير نقطة وصول عامة إلى تلك النسخة. ربما تكون المتغيرات العامة التي كنت تستخدمها لتخزين بعض الكائنات الضرورية مفيدة، لكنها غير آمنة بما أنك أي شيفرة قد تغي محتويات تلك المتغيرات وتتسبب في انهيار التطبيق. ويسمح لك نمط المفردة هنا -تمامًا كالمتغير العام (Global Variable)- بالوصول إلى بعض الكائنات من أي مكان في البرنامج، لكنه يحمي تلك النسخة من تغيير محتواها من قِبل الشيفرات الأخرى. وهناك جانب آخر من المشكلة: أنت لا تريد للشيفرة التي تحل مشكلة 1# مثلًا من الانتشار في برنامجك كله، فمن الأفضل وضعها داخل فئة واحدة، خاصة إن كانت بقية شيفرتك تعتمد عليها من قبل.

وقد صار نمط المفردة مشهورًا هذه الأيام إلى حد أن الناس قد تطلق اسم المفردة على شيء ما قد يحل مشكلة واحدة فقط من المشاكل المذكورة.

الحل