1 نظرة عامة
النمط المفرد له فوائد عديدة:
(1) يتم إنشاء فئات معينة بشكل متكرر بالنسبة لبعض الكائنات الكبيرة، وهذا يمثل حملًا ضخمًا للنظام.
(2) تم حذف المشغل الجديد، مما يقلل من تكرار استخدام ذاكرة النظام ويقلل ضغط GC.
(3) تتحكم بعض الفئات، مثل محرك التداول الأساسي للبورصة، في عملية المعاملة. إذا كان من الممكن إنشاء فئات متعددة، فسيتم إفساد النظام بالكامل.
2 شرح مفصل
هناك طريقتان شائعتا الاستخدام لكتابة النمط المفرد على النحو التالي.
2.1 النمط الصيني الجائع
إذا كان التطبيق يقوم دائمًا بإنشاء واستخدام النمط المفرد، أو إذا لم يكن ضغط الإنشاء ووقت التشغيل مرتفعًا جدًا، فيمكنك استخدام متغير ثابت خاص لإنشاء الكائن مسبقًا.
انسخ رمز الكود كما يلي:
الحزمة org.scott.singleton؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-16
* @وصف
*/
الطبقة العامة Singleton1 {
خاص ثابت Singleton1 UniqueInstance = new Singleton1();
سينجلتون خاص 1 () {
}
Singleton1 الثابت العام getInstance(){
إرجاع حالة فريدة؛
}
}
في هذه الحالة، عندما يقوم JVM بتحميل هذه الفئة، سيتم إنشاء الكائن وفقًا لتسلسل التهيئة. في الوقت نفسه، يمكن لـ JVM ضمان أن أي مؤشر ترابط يجب أن ينشئ هذا المثيل أولاً ومرة واحدة فقط قبل الوصول إلى هذا الكائن المفرد.
بالطبع، يمكنك أيضًا استخدام فئة داخلية ثابتة لإنجاز نفس الوظيفة.
انسخ رمز الكود كما يلي:
الحزمة org.scott.singleton؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-16
* @وصف
*/
الطبقة العامة Singleton2 {
سينجلتون خاص 2 () {
}
/**
* يتم استخدام فئة داخلية هنا للحفاظ على المفردة
* */
فئة ثابتة خاصة SingletonFactory {
مثيل Singleton2 الثابت الخاص = new Singleton2();
}
عام ثابت Singleton2 getInstance() {
إرجاع SingletonFactory.instance;
}
/**
* إذا تم استخدام الكائن للتسلسل، فيمكن ضمان بقاء الكائن ثابتًا قبل وبعد التسلسل
* */
كائن عام readResolve () {
إرجاع getInstance();
}
}
2.2 طريقة القفل المزدوج
"القفل المزدوج"، كما يوحي الاسم، عبارة عن قفلين. يُستخدم القفل الأول للتحقق مما إذا كان كائن المثيل الذي سيتم إنشاؤه قد تم إنشاؤه أم لا، ويتم استخدام القفل الثاني للمزامنة.
انسخ رمز الكود كما يلي:
الحزمة org.scott.singleton؛
/**
* @ المؤلف سكوت
* @الإصدار 2013-11-16
* @وصف
*/
الطبقة العامة Singleton3 {
Singleton3 فريد ثابت خاص متقلب ؛
سينجلتون خاص 3 () {
}
عام ثابت Singleton3 getInstance(){
إذا (uniqueInstance == فارغة){
متزامن (Singleton3.class) {
إذا (uniqueInstance == فارغة){
UniqueInstance = new Singleton3();
}
}
}
إرجاع حالة فريدة؛
}
}
إذا كانت متطلبات الأداء مرتفعة نسبيًا، فيمكن لهذه الطريقة تقليل وقت الإنشاء بشكل كبير. حاليًا، تعد هذه الطريقة أيضًا طريقة شائعة نسبيًا لإنشاء المفردات.