نمط سينجلتون

رسم تخطيطي للفئة يوضح نمط الفرد.

في البرمجة الموجهة للكائنات ، نمط singleton هو نمط تصميم برمجي يقيد إنشاء مثيل لفئة إلى مثيل مفرد. وهو أحد أنماط تصميم "Gang of Four" المعروفة ، والتي تصف كيفية حل المشكلات المتكررة في البرامج الموجهة للكائنات. [1] يكون النمط مفيدًا عندما تكون هناك حاجة إلى كائن واحد فقط لتنسيق الإجراءات عبر النظام.

على وجه التحديد، يسمح نمط singleton للفئات بما يلي: [2]

  • تأكد من أن لديهم مثيلًا واحدًا فقط
  • توفير سهولة الوصول إلى هذه الحالة
  • التحكم في إنشائها (على سبيل المثال، إخفاء منشئي الفئة )

يأتي المصطلح من المفهوم الرياضي "singleton" .

الاستخدامات الشائعة

غالبًا ما يتم تفضيل المتغيرات الفردية على المتغيرات العالمية لأنها لا تلوث مساحة الأسماء العالمية (أو مساحة الأسماء التي تحتوي عليها). بالإضافة إلى ذلك، فهي تسمح بالتخصيص والتهيئة البطيئة ، في حين أن المتغيرات العالمية في العديد من اللغات تستهلك الموارد دائمًا. [1] [3]

يمكن أيضًا استخدام نمط singleton كأساس لأنماط تصميم أخرى، مثل أنماط المصنع المجرد وطريقة المصنع والمنشئ والنموذج الأولي . غالبًا ما تكون كائنات الواجهة أيضًا كائنات فردية لأن كائن واجهة واحد فقط مطلوب.

يعد التسجيل حالة استخدام شائعة في العالم الحقيقي للكائنات الفردية، لأن جميع الكائنات التي ترغب في تسجيل الرسائل تتطلب نقطة وصول موحدة والكتابة مفهوميًا إلى مصدر واحد. [4]

التنفيذات

تضمن تنفيذات نمط singleton وجود مثيل واحد فقط من فئة singleton على الإطلاق وتوفر عادةً وصولاً عالميًا إلى هذا المثيل.

ويتم عادة تحقيق ذلك من خلال:

يتم تخزين المثيل عادةً كمتغير ثابت خاص ؛ يتم إنشاء المثيل عند تهيئة المتغير، في مرحلة ما قبل استدعاء الطريقة الثابتة لأول مرة.

يعتمد تنفيذ C++23 هذا على التنفيذ السابق لـ C++98 الموجود في الكتاب [ بحاجة لمصدر ] .

استيراد قياسي ؛ 

class Singleton { public : // يحدد عملية فئة تتيح للعملاء الوصول إلى مثيلها الفريد. static Singleton & get () { // قد يكون مسؤولاً عن إنشاء مثيل فريد خاص به. if ( nullptr == instance ) instance = new Singleton ; return * instance ; } Singleton ( const Singleton & ) = delete ; // قاعدة الثلاثة Singleton & operator = ( const Singleton & ) = delete ; static void destruct () { delete instance ; instance = nullptr ; } // تذهب الواجهة الموجودة هنا int getValue () { return value ; } void setValue ( int value_ ) { value = value_ ; } private : Singleton () = default ; // لا يوجد مُنشئ عام ~ Singleton () = default ; // لا يوجد مُدمر عام static Singleton * instance ; // إعلان متغير الفئة int value ; };  

  
     
    
           
     
  
      
      
     
     
      
  
  
    
     
  
     
      
  

     
     
     
   


Singleton * Singleton :: instance = nullptr ; // تعريف متغير الفئة    

int main () { Singleton :: get (). setValue ( 42 ); std :: println ( "value={}" , Singleton :: get (). getValue ()); Singleton :: destruct (); }  
  
   
  

مخرجات البرنامج هي

القيمة = 42

هذا تنفيذ لـ Meyers singleton [5] في C++11. لا يحتوي Meyers singleton على طريقة تدمير. مخرجات البرنامج هي نفسها المذكورة أعلاه.

استيراد قياسي ؛ 

الفئة Singleton { public : static Singleton & get () { static Singleton instance ; return instance ; } int getValue () { return value ; } void setValue ( int value_ ) { value = value_ ; } private : Singleton () = default ; ~ Singleton () = default ; int value ; };  

     
      
     
  
    
     
  
     
      
  

    
    
   


int main () { Singleton :: get (). setValue ( 42 ); std :: println ( "value={}" , Singleton :: get (). getValue ()); }  
  
   

التهيئة الكسولة

قد يستخدم تنفيذ singleton تهيئة كسولة حيث يتم إنشاء المثيل عند استدعاء الطريقة الثابتة لأول مرة. في البرامج متعددة الخيوط ، يمكن أن يتسبب هذا في حدوث ظروف سباق تؤدي إلى إنشاء مثيلات متعددة. المثال التالي لـ Java 5+ [6] هو تنفيذ آمن للخيوط ، باستخدام تهيئة كسولة مع قفل مزدوج الفحص .

الفئة العامة Singleton {   

    حالة Singleton متقلبة خاصة ثابتة = null ؛      

    Singleton خاص () {}  

    public static Singleton getInstance () { if ( instance == null ) { synchronized ( Singleton .class ) { if ( instance == null ) { instance = new Singleton ( ); } } } return instance ; } }    
            
             
                    
                       
                
            
        
         
    

نقد

يعتبر البعض أن النمط المنفرد هو نمط مضاد يقدم حالة عالمية في التطبيق، غالبًا دون داعٍ. يؤدي هذا إلى اعتماد محتمل على النمط المنفرد من قبل كائنات أخرى، مما يتطلب تحليل تفاصيل التنفيذ لتحديد ما إذا كان الاعتماد موجودًا بالفعل. [7] يمكن أن يؤدي هذا الاقتران المتزايد إلى صعوبات في اختبار الوحدة . [8] بدوره، يفرض هذا قيودًا على أي تجريد يستخدم النمط المنفرد، مثل منع الاستخدام المتزامن لمثيلات متعددة. [8] [9] [10]

كما تنتهك الكائنات المنفردة مبدأ المسؤولية الفردية لأنها مسؤولة عن فرض تفردها إلى جانب أداء وظائفها الطبيعية. [8]

انظر أيضا

مراجع

  1. ^ ab Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides (1994). أنماط التصميم: عناصر البرامج الموجهة للكائنات القابلة لإعادة الاستخدام . أديسون ويسلي. ص 127 وما يليه. ISBN 0-201-63361-2.{{cite book}}:CS1 maint: أسماء متعددة: قائمة المؤلفين ( الرابط )
  2. ^ "نمط تصميم Singleton - المشكلة والحل وإمكانية التطبيق". w3sDesign.com . تم الاسترجاع في 2017-08-16 .
  3. ^ Soni, Devin (31 July 2019). "ما هو Singleton؟". BetterProgramming . تم الاسترجاع في 28 أغسطس 2021 .
  4. ^ Rainsberger, JB (1 يوليو 2001). "استخدم العناصر الفردية بحكمة". IBM. مؤرشف من الأصل في 24 فبراير 2021. تم الاسترجاع في 28 أغسطس 2021 .
  5. ^ سكوت مايرز (1997). لغة C++ أكثر فعالية . أديسون ويسلي. ص 146 وما يليها. رقم ISBN 0-201-63371-X.
  6. ^ إريك فريمان، إليزابيث فريمان، كاثي سييرا، وبرت بيتس (أكتوبر 2004). "5: أشياء فريدة من نوعها: نمط سينجلتون". أنماط التصميم في الرأس أولاً (الطبعة الأولى). أوريلي ميديا، إنك. ص. 182. رقم ISBN 978-0-596-00712-6.{{cite book}}:CS1 maint: أسماء متعددة: قائمة المؤلفين ( الرابط )
  7. ^ "لماذا تعد العناصر المنفردة مثيرة للجدل". أرشيف كود جوجل . مؤرشف من الأصل في 6 مايو 2021. تم الاسترجاع في 28 أغسطس 2021 .
  8. ^ abc Button, Brian (25 May 2004). "لماذا تعتبر Singletons شريرة". Being Scott Densmore . Microsoft. مؤرشف من الأصل في 15 يوليو 2021 . تم الاسترجاع في 28 أغسطس 2021 .
  9. ^ ستيف ييجي. Singletons Considered dumb، سبتمبر 2004
  10. ^ هيفري، ميسكو، "الحالة العالمية والفردية"، محادثات الكود النظيف ، 21 نوفمبر 2008.
  • المقالة الكاملة "شرح نمط Singleton في Java"
  • أربع طرق مختلفة لتنفيذ singleton في Java "طرق تنفيذ singleton في Java"
  • مقتطف من كتاب: تنفيذ نمط Singleton في C# بقلم جون سكيت
  • Singleton في مركز مطوري الأنماط والممارسات في Microsoft
  • مقالة IBM بعنوان "القفل المزدوج ونمط Singleton" بقلم بيتر هاجار
  • جيري، ديفيد (25 أبريل 2003). "كيفية التنقل عبر نمط Singleton البسيط المخادع". أنماط تصميم Java. JavaWorld . تم الاسترجاع في 2020-07-21 .
  • أداة Google Singleton Detector (تحلل البايت كود Java للكشف عن العناصر الفردية)
Retrieved from "https://en.wikipedia.org/w/index.php?title=Singleton_pattern&oldid=1265430421"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate