التعريف: تتمثل الوظيفة الرئيسية لنمط Singleton في التأكد من وجود مثيل واحد فقط من الفئة.
في العديد من العمليات ، مثل إنشاء اتصال قاعدة بيانات الدليل ، مطلوب هذه العملية ذات الخيوط الواحدة.
أيضًا ، يمكن أن تكون Singleton مقاسًا ؛ يمكن أن تحافظ على فصول Singleton هذا العدد وتزويدها تلقائيًا عن طريق التزامن بأمان.
بالإضافة إلى ذلك ، يمكن أن يكون Singleton أيضًا عديمي الجنسية. يوفر وظائف تشبه الأدوات ،
يوفر لنا نموذج Singleton إمكانية تنفيذ هذه الطريقة. تتمثل ميزة استخدام Singleton في أنه يمكن أن يحفظ الذاكرة ، لأنه يحد من عدد الحالات ويؤدي إلى مجموعة Garbage Java.
غالبًا ما نرى أنه يتم تنفيذ لوادر فئة أيضًا في وضع Singleton في وضع المصنع ، لأن الفئة المحملة تنتمي فعليًا إلى الموارد.
كيفية استخدام وضع Singleton
عادةً ما يحتوي نمط Singleton العام على عدة أشكال:
نسخة الكود كما يلي:
الطبقة العامة سينجلتون {
Singleton الخاص () {}
// أليس من الغريب تحديد مثيل لنفسك داخل نفسك؟
// لاحظ أن هذا خاص فقط للمكالمات الداخلية
مثيل Singleton ثابت خاص = New Singleton () ؛
// هنا طريقة ثابتة للوصول الخارجي إلى هذه الفئة ، والتي يمكن الوصول إليها مباشرة
Singleton Singleton GetInstance () {
مثيل العودة ؛
}
}
النموذج الثاني:
نسخة الكود كما يلي:
الطبقة العامة سينجلتون {
مثيل Singleton ثابت خاص = فارغ ؛
Singleton Singleton GetInstance () {{{
// تم تحسين هذه الطريقة على ما سبق.
// إنشاء مثيلات أثناء الاستخدام ، وتحسين الكفاءة!
إذا (مثيل == فارغ)
مثيل = جديد singleton () ؛
مثيل العودة ؛
}
}
يمكن استخدام Singleton.getInstance () للوصول إلى دروس Singleton.
النموذج الثاني أعلاه هو التهيئة البطيئة ، مما يعني أن المفرد الأولي مدعو لأول مرة وليس هناك حاجة لتوليدها في المستقبل.
لاحظ أن المزامنة في نموذج التهيئة البطيئة أمر مهم. هناك العديد من المناقشات حول التهيئة البطيئة حول القفل المزدوج (DCL) ، وسيقوم المهتمين به بزيادة دراسته.
ويعتقد عمومًا أن الشكل الأول أكثر أمانًا.
أشياء يجب ملاحظتها عند استخدام وضع Singleton
في بعض الأحيان ، لا يمكن استخدام Singleton الغرض من Singleton. -Server و Cross-JVM.
دعنا نأخذ ServiceLocator of Sun's Pet Store Source Code (Pet Store 1.3.1) كمثال ونحللها لفترة وجيزة:
في متجر الحيوانات الأليفة ، يوجد نوعان من servicelocator ، أحدهما في دليل EJB والآخر في دليل الويب. خدمات تحديد المواقع ، ولكن لماذا تفصلها؟ بعد دراسة متأنية لهذين الجنود ، وجدت الفرق: يتبنى ServiceLocator وضع Singleton في الويب ، ينتمي ServiceLocator إلى تحديد الموارد ، لذلك بالطبع ، يجب استخدام وضع Singleton. ومع ذلك ، في EJB ، فقد نموذج Singleton وظيفته ، لذلك يتم تقسيم ServiceLocator إلى نوعين ، واحد هو لخدمات الويب والآخر لخدمات EJB.
يبدو نمط Singleton بسيطًا ومريحًا جدًا للاستخدام ، ولكن من الصعب جدًا استخدامه جيدًا.