ما هو المفرد في جاوة؟
يعد Singleton واحدًا من أبسط أنماط التصميم على مستوى الفصل الدراسي. في بعض الأحيان يقول الناس "هذه الفئة مفردة"، مما يعني أن الفئة تطبق نمط التصميم المفرد. في بعض الأحيان يكون من الضروري كتابة فئة حيث نقيد إنشاء مثيل لكائن واحد. على سبيل المثال، فئة مسؤولة عن تسجيل الدخول أو الاتصال بـ قاعدة البيانات. يصف نمط التصميم المفرد كيف يمكننا تحقيق ذلك. المفرد هو نمط تصميم يقوم بأمرين:-
إنه يضمن أنه لن يكون هناك سوى مثيل واحد للفئة.
-
فهو يوفر نقطة واحدة للوصول العالمي إلى هذا المثيل.
-
منشئ خاص. وهذا يحد من القدرة على إنشاء كائنات للفئة خارج الفئة نفسها.
-
طريقة ثابتة عامة تقوم بإرجاع مثيل الفئة. تسمى هذه الطريقة getInstance . هذه هي نقطة الوصول الشامل إلى مثيل الفصل.
خيارات التنفيذ
يتم تطبيق نمط التصميم المفرد بطرق مختلفة. كل خيار جيد وسيئ بطريقته الخاصة. وكما هو الحال دائمًا، لا يوجد خيار مثالي هنا، ولكن يجب علينا أن نسعى جاهدين لتحقيقه. أولاً، دعونا نقرر ما الذي يشكل الجيد والسيئ، وما هي المقاييس التي تؤثر على كيفية تقييمنا للتطبيقات المختلفة لنمط التصميم. لنبدأ بالخير. فيما يلي العوامل التي تجعل التنفيذ أكثر جاذبية وجاذبية:-
التهيئة البطيئة: لا يتم إنشاء المثيل إلا عند الحاجة إليه.
-
رمز بسيط وشفاف: هذا المقياس، بالطبع، ذاتي، لكنه مهم.
-
سلامة الخيط: التشغيل الصحيح في بيئة متعددة الخيوط.
-
أداء عالٍ في بيئة متعددة الخيوط: حظر بسيط أو معدوم لسلسلة المحادثات عند مشاركة المورد.
-
لا توجد تهيئة كسولة: عندما يتم تحميل الفصل عند بدء تشغيل التطبيق، بغض النظر عما إذا كانت هناك حاجة إليه أم لا (من المفارقة أنه من الأفضل أن تكون كسولًا في عالم تكنولوجيا المعلومات)
-
رمز معقد ويصعب قراءته. هذا المقياس هو أيضا ذاتي. إذا بدأت عيناك تنزف، فسنفترض أن التنفيذ ليس هو الأفضل.
-
عدم سلامة الخيط. وبعبارة أخرى، "خطر الخيط". عملية غير صحيحة في بيئة متعددة الخيوط.
-
أداء ضعيف في بيئة متعددة الخيوط: تحظر سلاسل العمليات بعضها البعض طوال الوقت أو في كثير من الأحيان عند مشاركة المورد.
شفرة
نحن الآن جاهزون للنظر في خيارات التنفيذ المختلفة والإشارة إلى الإيجابيات والسلبيات:بسيط
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
أبسط التنفيذ. الايجابيات:
-
كود بسيط وشفاف
-
سلامة الخيط
-
أداء عالي في بيئة متعددة الخيوط
- لا التهيئة البطيئة.
التهيئة البطيئة
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {}
public static Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
الايجابيات:
-
التهيئة البطيئة.
-
ليست آمنة للخيط
الوصول المتزامن
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
}
الايجابيات:
-
التهيئة البطيئة.
-
سلامة الخيط
-
أداء ضعيف متعدد الخيوط
قفل مزدوج التحقق
public class Singleton {
private static final Singleton INSTANCE;
private Singleton() {
}
public static Singleton getInstance() {
if (INSTANCE == null) {
synchronized (Singleton.class) {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
}
}
return INSTANCE;
}
}
الايجابيات:
-
التهيئة البطيئة.
-
سلامة الخيط
-
أداء عالي في بيئة متعددة الخيوط
-
غير مدعوم في الإصدارات السابقة من Java الأقل من 1.5 (تم إصلاح استخدام الكلمات الأساسية المتقلبة منذ الإصدار 1.5)
صاحب الصف
public class Singleton {
private Singleton() {
}
private static class SingletonHolder {
public static final Singleton HOLDER_INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.HOLDER_INSTANCE;
}
}
الايجابيات:
-
التهيئة البطيئة.
-
سلامة الخيط.
-
أداء عالي في بيئة متعددة الخيوط.
-
تتطلب العملية الصحيحة ضمانًا بتهيئة الكائن المفرد بدون أخطاء. بخلاف ذلك، سيؤدي الاستدعاء الأول للأسلوب getInstance إلى ظهور الخطأ ExceptionInInitializerError ، وستنتج جميع الاستدعاءات اللاحقة الخطأ NoClassDefFoundError .
تطبيق | التهيئة البطيئة | سلامة الخيط | أداء متعدد الخيوط | متى يجب استخدام؟ |
---|---|---|---|---|
بسيط | - | + | سريع | أبداً. أو ربما عندما لا تكون التهيئة البطيئة مهمة. ولكن لن يكون أفضل أبدا. |
التهيئة البطيئة | + | - | غير قابل للتطبيق | دائمًا عندما لا تكون هناك حاجة إلى تعدد العمليات |
الوصول المتزامن | + | + | بطيء | أبداً. أو ربما عندما لا يهم الأداء متعدد الخيوط. ولكن لن يكون أفضل أبدا. |
قفل مزدوج التحقق | + | + | سريع | في حالات نادرة عندما تحتاج إلى معالجة الاستثناءات عند إنشاء المفرد (عندما لا يكون المفرد لصاحب الفئة قابلاً للتطبيق) |
صاحب الصف | + | + | سريع | عندما تكون هناك حاجة إلى تعدد مؤشرات الترابط ويكون هناك ضمان بأنه سيتم إنشاء الكائن المفرد دون مشاكل. |
إيجابيات وسلبيات النمط المفرد
بشكل عام، يقوم الفرد المنفرد بما هو متوقع منه بالضبط:-
إنه يضمن أنه لن يكون هناك سوى مثيل واحد للفئة.
-
فهو يوفر نقطة واحدة للوصول العالمي إلى هذا المثيل.
-
تنتهك الفئة الفردية مبدأ المسؤولية الفردية: بالإضافة إلى واجباتها المباشرة، تتحكم الفئة الفردية أيضًا في عدد الحالات.
-
إن اعتماد الفصل العادي على المفرد غير مرئي في العقد العام للفئة.
-
المتغيرات العالمية سيئة. في نهاية المطاف، يتحول المفرد إلى متغير عالمي ضخم.
-
يؤدي وجود المفرد إلى تقليل قابلية اختبار التطبيق ككل والفئات التي تستخدم المفرد على وجه الخصوص.
GO TO FULL VERSION