وضع Singleton
من المهم أحيانًا أن يكون لديك مثال واحد فقط من الفصل. على سبيل المثال ، يجب أن يحتوي النظام على مثيل لإدارة نافذة واحد فقط.
نمط Singleton هو أبسط نمط تصميم: الفئة مسؤولة عن إنشاء إنشاء نفسها ، مما يضمن وجود مثيل واحد فقط ، وتوفير إدخال للوصول إلى هذه الحالة.
غاية
1. تأكد من إنشاء مثيل واحد فقط.
2. توفير إدخال للوصول إلى هذه الحالة.
استخدم Final للتأكد من إنشاؤه مرة واحدة ، ويضمن المنشئ الخاص مثيله. تضمن طريقة GetInstance للجمهور أن الوصول الخارجي ممكن. فيما يلي الوضع الجائع:
الطبقة العامة Singleton {مثيل خاص في المجلس الوطني = New Singleton () ؛ Singleton الخاص () {} ثابتة عامة Singleton getInstance () {return مثيل ؛ }}
الوضع الكسول:
الطبقة العامة singletondemo {مثيل خاص ثابت ثابت في Singletondemo = null ؛ خاص singletondemo () {} static singletondemo getInstance () {if (مثيل == null) {synchronized (singletondemo .class) {if (مثيل == null) {مثيل = جديد singletondemo () ؛ }} مثيل الإرجاع ؛ }}
السيناريوهات والأمثلة المعمول بها
1. فئة المسجل يمنع إنشاء مثيل لوجبر في كل مرة يتم فيها طباعة السجل.
2. فئة التحكم ، عموما هناك مثيل تحكم واحد فقط في النظام بأكمله.
قضايا وتطبيقات محددة
1. مؤهل الخيط ، يجب أن يكون وضع Singleton القوي آمنًا للموضوع.
2. وضع Lazy يستخدم آلية قفل مزدوجة.
3. يستخدم وضع النسر متغيرات ثابتة ويتم إنشاء مثيل لها عند تحميل البرنامج ، مما يضمن وجود مثيل واحد فقط.
4. عادة ما يتم تصميم أساليب المصنع والمصنع كأنماط مفردة لضمان وجود مصنع واحد فقط.
5. عند استخدام التسلسل والتخفيف ، سيتم إنشاء مثيلات متعددة. استخدم وظيفة ReadResolve لتجنب ذلك ، ولكن من الأفضل عدم استخدام التسلسل.
تنفذ Singleton من الطبقة العامة القابلة للتسلسل {... // يتم استدعاء هذه الطريقة فورًا بعد أن يتم تسوية كائن من هذه الفئة. // هذه الطريقة تُرجع مثيل Singleton. كائن محمي readResolve () {return getInstance () ؛ }}
النقاط الرئيسية
1. في البرامج متعددة الخيوط ، انتبه إلى مزامنة البيانات.
2. عند التسلسل ، استخدم طريقة ReadResolve لإرجاع المثيل لتجنب إنشاء كائنات متعددة.
3. إذا تم تحميله بواسطة لوادر فئة متعددة ، فسيتم إنشاء مثيلات متعددة.
وضع المصنع البسيط
نموذج المصنع البسيط للدوافع هو الأساس والتنفيذ الأولي لأساليب المصنع والمصنع التجريدي.
غاية
1. لا تكشف عن تفاصيل إنشاء كائن للعميل.
2. إنشاء كائن من خلال واجهة مشتركة.
ينجز
التنفيذ بسيط للغاية:
1. عندما يحتاج العميل إلى منتج ، فإنه لا يستخدم جديدًا لإنشائه ، ولكنه يوفر وصفًا للمنتج للمصنع ، مما يسمح للمصنع بتوفير منتج جديد.
2. المصنع يستند إلى منتج للعميل.
3. يستخدم العميل المنتج التجريدي ، دون الاهتمام بالتنفيذ الملموس للمنتج.
مثال
1. برنامج الرسم لأشكال الرسم. الشكل هو واجهة المنتج ، والمثلثات هي المنتج الخرساني. يمكننا إنشاء مصنع ثم إنشاء المنتج وفقًا لوصف العميل. ومع ذلك ، عند إضافة أشكال جديدة ، نحتاج إلى تعديل فئة المصنع.
قضايا وتطبيقات محددة
1. عند إضافة منتجات جديدة ، يجب تعديل المصنع.
PROCAL PRODUCTFACTORY {Public Product CreateProduct (String ProductId) {if (id == id1) إرجاع OneProduct () جديد ؛ if (id == id2) إرجاع جديد otherproduct () ؛ ... // حتى لوضع الهوية الأخرى إرجاع فارغ ؛ // إذا لم يكن لدى المعرف أي من القيم المتوقعة} ...}بشكل عام ، نستخدم بيان IF للحكم على وصف المنتج وتثبيت منتجات مختلفة. عندما تكون هناك منتجات جديدة ، نحتاج إلى إضافة أحكام جديدة. يمكن حل هذه المشكلة بواسطة أنماط المصنع التجريدية.
لخص
1. استخدمه فقط عندما تحتاج حقًا إلى وضع المصنع ، وإلا فإنه سيزيد من تعقيد البرنامج. على سبيل المثال ، عندما يكون للكائنات المتعددة أنواع أساسية مماثلة ، يمكنك التفكير في استخدام وضع المصنع البسيط لإنشاء كائنات موحدة.
2. المصانع البسيطة لديها المزيد من بيانات فرع الحكم ، والتي تنتهك مبدأ فتح وإغلاق التعديلات. لذلك ، من الحكمة استخدام وضع المصنع البسيط لبعض البرامج الثابتة والبسيطة ، واستخدام وضع المصنع التجريدي أو وضع طريقة المصنع لبعض البرامج المعقدة والموسعة في كثير من الأحيان.