مفهوم نمط المفرد:
نمط Singleton في Java هو نمط تصميم شائع. ينقسم نمط Singleton إلى ثلاثة أنواع: Lazy Singleton ، Hungry Singleton ، و Singleton المسجل.
يحتوي وضع Singleton على الخصائص التالية:
1. يمكن أن يكون هناك مثيل واحد فقط في فصل المفرد.
2. يجب أن تنشئ فئة Singleton مثيلها الفريد.
3. يجب أن توفر فئة Singleton هذه المثيل لجميع الكائنات الأخرى.
يضمن نمط Singleton أن يكون لدى الفصل مثيلًا واحدًا فقط ، ويستند إلى مثيله ويوفر هذا الحالة للنظام بأكمله. في أنظمة الكمبيوتر ، غالبًا ما يتم تصميم كائنات برنامج التشغيل لتجمعات مؤشرات الترابط ، وذاكرة التخزين المؤقت ، وكائنات السجل ، ومربعات الحوار ، والطابعات ، وبطاقات الرسومات كفرد. هذه التطبيقات لها وظائف مدير الموارد إلى حد ما. يمكن أن يحتوي كل جهاز كمبيوتر على العديد من الطابعات ، ولكن يمكن أن يكون التخزين المؤقت للطابعة الواحدة متاحًا لتجنب وظيفتين للطباعة الناتج إلى الطابعة في نفس الوقت. يمكن أن يكون لكل جهاز كمبيوتر العديد من منافذ الاتصالات ، ويجب أن يدير النظام مركزيًا منافذ الاتصال هذه لتجنب ميناء اتصال واحد يتم استدعاؤه في وقت واحد بواسطة طلبين. باختصار ، فإن اختيار نموذج Singleton هو تجنب الدول غير المتسقة وتجنب الصعوبة السياسية.
أولاً ، دعونا نلقي نظرة على تطبيق Singleton الكلاسيكي.
الطبقة العامة singleton {private static singleton requiredInstance = null ؛ Singleton الخاص () {// موجود فقط لهزيمة التثبيت. } Singleton GetInstance () {if (requiredInstance == null) {requiredInstance = new Singleton () ؛ } إرجاع فريدة من نوعها ؛ } // طرق أخرى ...}يتجنب Singleton أن يتم إنشاء فئة خارجيًا عن طريق الحد من المُنشئ على القطاع الخاص. في نفس نطاق الجهاز الظاهري ، لا يمكن الوصول إلى الحالة الوحيدة من Singleton إلا من خلال طريقة getInstance (). (في الواقع ، من خلال آلية انعكاس Java ، يمكنك إنشاء إنشاء فصل مع بنية خاصة ، والتي ستقوم بشكل أساسي بإبطال جميع تطبيقات Java Singleton. لن تتم مناقشة هذه المشكلة هنا ، وسأعتقد أن آلية الانعكاس غير موجودة.)
ومع ذلك ، فإن التنفيذ أعلاه لا يعتبر مشكلات سلامة الخيوط. تعني سلامة مؤشرات الترابط: إذا كان الرمز الخاص بك في عملية يتم فيها تشغيل مؤشرات ترابط متعددة في نفس الوقت ، وقد تقوم هذه المواضيع بتشغيل هذا الرمز في نفس الوقت. إذا كانت نتيجة كل تشغيل هي نفس نتيجة تشغيل مؤشر ترابط واحد ، وكانت قيم المتغيرات الأخرى هي نفسها كما هو متوقع ، فهي آمنة مؤشرات الترابط. بمعنى آخر: الواجهة التي توفرها فئة أو برنامج هي عملية ذرية لخيط أو أن التبديل بين مؤشرات الترابط المتعددة لن يتسبب في غموض نتيجة التنفيذ للواجهة ، أي أننا لا نحتاج إلى النظر في مشكلة التزامن. من الواضح أن التنفيذ أعلاه لا يفي بمتطلبات سلامة الخيط ، ومن المحتمل أن تظهر حالات القميص المتعددة في بيئة متزامنة.
فئة عامة TestStream {اسم السلسلة الخاصة ؛ السلسلة العامة getName () {return name ؛ } public void setName (اسم السلسلة) {this.name = name ؛ } // يمكن أن تحتوي هذه الفئة على مثيل واحد فقط testStream () {} // مُنشئ غير خاص غير Argument // يجب إنشاء هذه الفئة من تلقاء نفسها // هناك طريقتين/*اختبار خاص tsstream ts = new testStream () ؛*/private teststream ts1 = null ؛ // يجب أن توفر هذه الفئة تلقائيًا كائن المثيل هذا إلى نظام TestStream Staticstream GetTest () {if (ts1 == null) {ts1 = جديد testStream () ؛ } إرجاع TS1 ؛ } public void getInfo () {system.out.println ("message message"+name) ؛ }} الفئة العامة testmain {public static void main (string [] args) {testStream s = testStream.getTest () ؛ S.SetName ("Zhang Xiaoxiang") ؛ System.out.println (S.GetName ()) ؛ TestStream S1 = testStream.getTest () ؛ s1.setName ("Zhang Xiaoxiang") ؛ System.out.println (s1.getName ()) ؛ S.GetInfo () ؛ s1.getInfo () ؛ if (s == s1) {system.out.println ("تم إنشاء نفس الحالة") ؛ } آخر if (s! = s1) {system.out.println ("تم إنشاؤه وليس نفس المثيل") ؛ } آخر {system.out.println ("خطأ التطبيق") ؛ }}}}نتائج التشغيل:
Zhang Xiaoxiang Zhang Xiaoxiang
رسالة الإخراج Zhang Xiaoxiang
رسالة الإخراج Zhang Xiaoxiang أنشأ نفس المثيل
الخلاصة: من النتائج ، يمكننا أن نرى أن نمط Singleton يوفر تطبيقًا موجهًا للكائن مع نقطة وصول فريدة لكائن. بغض النظر عن الوظيفة التي تنفذها ، سيشارك التطبيق بأكمله كائن مثيل.
1
// فئة Singleton الجائعة. عند تهيئة الفصل الدراسي ، تم إنشاء مثيل للطبقة العامة Singleton1 نفسه {// Private Constructor Private Singleton1 () {} // إضافة Singleton1 Singleton1 الخاصة = New Singleton1 () ؛ // Method Static Factory Method Public Static Singleton1 getInstance () {return Single ؛ }} 2. فئة Singleton Lazy
// Laggy Singleton Class. Instantiate Class Public ClasseTon2 عندما تسمى أول مرة من الدرجة العامة Singleton2 {// Private Constructor Private Singleton2 () {} // لاحظ أنه لا يوجد Singleton2 Singleton2 الخاص ؛ // طريقة مصنع ثابتة متزامنة عامة Singleton2 getInstance () {if (single == null) {single = new Singleton2 () ؛ } إرجاع واحد ؛ }} 3. فئة المفرد المسجلة
استيراد java.util.hashmap ؛ استيراد java.util.map ؛ // فئة Singleton المسجلة. // على غرار الطريقة في الربيع ، قم بتسجيل اسم الفصل واحصل عليه مباشرة منه في المرة القادمة. Class Class Singleton3 {Private Static Map <String ، Singleton3> map = new HashMap <string ، singleton3> () ؛ ثابت {singleton3 single = new Singleton3 () ؛ map.put (single.getClass (). getName () ، single) ؛ }. System.out.println ("name == null"+"---> name ="+name) ؛ } if (map.get (name) == null) {try {map.put (name ، (singleton3) class.forname (name) .NewInstance ()) ؛ } catch (InstantiationException e) {e.printStackTrace () ؛ } catch (alfictAccessException e) {e.printStackTrace () ؛ } catch (classNotFoundException e) {E.PrintStackTrace () ؛ }} return map.get (name) ؛ } // طريقة تجارية تخطيطي سلسلة عامة حول () {return "hello ، أنا regsingleton." ؛ } public static void main (string [] args) {singleton3 single3 = singleton3.getInstance (null) ؛ system.out.println (single3.about ()) ؛ }} ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.