تعريف نمط المصنع: يوفر واجهة لإنشاء كائنات.
لماذا تستخدم وضع المصنع
نموذج المصنع هو النموذج الأكثر استخدامًا الذي نستخدمه.
لماذا يتم استخدام نموذج المصنع بشكل شائع؟ نظرًا لأن نمط المصنع يعادل إنشاء كائنات مثيل جديدة ، فإننا يتعين علينا غالبًا إنشاء كائنات مثيل بناءً على فئة الفئة. يجب أن تكون أكثر حذراً.
لنأخذ فئة العينة كمثال.
نسخة الكود كما يلي:
عينة عينة = عينة جديدة () ؛
ومع ذلك ، فإن الواقع هو أننا عادة ما نقوم ببعض أعمال التهيئة عند إنشاء عينة مثيلات ، مثل قواعد بيانات استعلام التعيين ، إلخ.
بادئ ذي بدء ، ما نفكر فيه هو أنه يمكننا استخدام مُنشئ العينة ، بحيث يتم إنشاء المثيل وكتابته على النحو التالي:
نسخة الكود كما يلي:
عينة عينة = عينة جديدة (المعلمة) ؛
ومع ذلك ، إذا كان العمل التهيئة المنجز عند إنشاء عينة غير بسيط مثل المهمة ، فقد يكون ذلك بمثابة رمز طويل.
لماذا لا يملك المبتدئون هذا الشعور؟ الطريقة تعادل وضع الكثير من البيض. يتم إرسال الرمز الطويل إلى كل قطاع ، ويتم "التغليف" مرة أخرى (تقليل اتصال الاقتران بين الأجزاء) ، بحيث يتم تنوع المخاطر. لا مزيد من الأشياء التي ستؤثر على كل قطعة.
في هذا المثال ، أولاً ، نحتاج إلى فصل عمل إنشاء مثيل عن عمل استخدام مثيل ، أي فصل الكمية الكبيرة من أعمال التهيئة المطلوبة لإنشاء مثيل من مُنشئ العينة.
في هذا الوقت ، نحتاج إلى نمط مصنع المصنع لإنشاء كائنات ، ولم يعد بإمكاننا استخدام العينة الجديدة البسيطة (المعلمات). أيضًا ، إذا كانت العينة لها ميراث مثل mysample ، وفقًا للبرمجة الموجهة نحو الواجهة ، نحتاج إلى تجريد عينة في واجهة. الآن عينة هي واجهة ، مع اثنين من الفئات الفرعية mysample و hissample. عندما نريد إنشاء مثيل لها ، على النحو التالي:
نسخة الكود كما يلي:
عينة mysample = new MySample () ؛
مع تعميق المشروع ، قد "يخرج الكثير من الأبناء" ، لذلك نحن بحاجة إلى إنشاء مثيل لهما واحدًا تلو الآخر لا مفر منه في البرامج التقليدية.
ولكن إذا استخدمت بوعي نموذج المصنع من البداية ، فقد اختفت هذه المشاكل.
طريقة المصنع
ستقوم ببناء مصنع متخصص في إنتاج عينة مثيلات:
نسخة الكود كما يلي:
مصنع الطبقة العامة {
منشئ العينة الثابتة العامة (int أي) {
// getClass إنشاء عينة بشكل عام ، يمكن استخدام تحميل الفئة الديناميكية لتحميل الفئات.
إذا (أي == 1)
إرجاع جديد samplea () ؛
آخر إذا (أي == 2)
إرجاع عينة جديدة () ؛
}
}
ثم في برنامجك ، إذا كنت ترغب في إنشاء نموذج ، استخدم رمز كود النسخ على النحو التالي:
عينة العينة = المصنع. creator (1) ؛
وبهذه الطريقة ، لا تشارك الفئة الفرعية المحددة في العملية بأكملها. كلما كان من الأسهل ارتكاب أخطاء. كل من قام بعمل محدد له فهم عميق لهذا الأمر. يبدو أنه يمكننا أيضًا فهم مبادئ الحياة من البرمجة؟
استخدام أساليب المصنع للانتباه إلى عدة أدوار. لإنشاء عينة المنتج ، كما هو موضح في الشكل أدناه.
لكي تكون أكثر تعقيدًا ، فإن التوسع في فئة المصنع ، التي ترث أيضًا ConcreteFactory من فئة التنفيذ.
مصنع مجردة
يتضمن نموذج المصنع: طريقة المصنع والمصنع التجريدي.
الفرق بين هذين النموذجين هو في تعقيد إنشاء الأشياء. إذا أصبحت طريقة إنشاء كائن معقدة ، كما في طريقة المصنع أعلاه ، فإنها هي إنشاء عينة كائن ، إذا كان لدينا نموذج جديد للمنتج 2.
على افتراض أن العينة تحتوي على فئتين ملموستين Samplea و Samleb ، كما أن العينة 2 تحتوي على فئتين ملموستين Sample2a و SampleB2. تطبيقات فئة فرعية مختلفة ، ما يلي هو توسيع المصنع في المثال أعلاه إلى مصنع مجردة:
نسخة الكود كما يلي:
مصنع الفئة التجريدية العامة {
خالق العينة المجردة العامة () ؛
عينة المجردة العامة 2 خالق (اسم السلسلة) ؛
}
الطبقة العامة SimpleFactory يمتد المصنع {
عينة عامة Creator () {......... إرجاع Samplea جديد}
Sample 2 Creator (اسم السلسلة) {......... إرجاع new sample2a}
}
الطبقة العامة بومباكتيوري يمتد المصنع {
عينة عامة Creator () {...... إرجاع عينة جديدة}
Sample Sample2 Creator (اسم السلسلة) {...... إرجاع نموذج جديد 2b}
}
مما سبق ، ينتج كل منهما المصنعان مجموعة من العينة و Sample2.
هناك نقطة رئيسية أخرى في المصنع التجريدي ، لأن هناك علاقة معينة بين الأساليب التي تنتج عينة 2 في SimpleFactory ، لذلك يجب تجميع هذه الطريقتين في فئة واحدة العملية موحدة ، على سبيل المثال: عملية التصنيع بسيطة نسبيًا ، وبالتالي فإن الاسم بسيط.
في التطبيقات العملية ، يتم استخدام طريقة المصنع بشكل متكرر ، ويتم دمجها مع اللوادر الفئة الديناميكية.
أمثلة على نموذج مصنع Java
دعنا نأخذ Jive's Forumfactory كمثال.
نسخة الكود كما يلي:
Public Class Class Formfactory {
كائن ثابت خاص = كائن جديد () ؛
المنتدى الثابت العام getInstance (إذن إذن) {
// إذا لم يتم إقرار ترخيص صالح ، فالارتداد فارغًا.
if (إذن == null) {return null ؛
// ما يلي يستخدم وضع Singleton Singleton
إذا (المصنع == فارغ) {
متزامن (initlock) {
إذا (المصنع == فارغ) {...
يحاول {
// إعادة طبع ديناميكية
الفئة C = class.forname (className) ؛
المصنع = (ForumFactory) C.NewInstance () ؛
} catch (استثناء e) {return null ؛
}
}
}
// الآن ، وكيل إرجاع.
إرجاع New ForumFactoryProxy (إذن ، مصنع ، مصنع. getPermissions (إذن)) ؛
}
// يتم الانتهاء من طريقة إنشاء المنتدى بواسطة فئة فرعية وراثة ForumFactory.
المنتدى التجريدي العام CreateForum (اسم السلسلة ، وصف السلسلة)
رمي غير مصرح به ، ForumAlReadyExistsexception ؛
....
}
نظرًا لأن Jive تخزن الآن منشورات المنتدى وبيانات المحتوى الأخرى من خلال نظام قاعدة البيانات ، إذا كنت ترغب في تغييره ليتم تنفيذه من خلال نظام الملفات ، فإن طريقة المصنع هذه توفر واجهة ديناميكية:
نسخة الكود كما يلي:
سلسلة ثابتة خاصة className = "com.jivesoftware.forum.database.dbforumFactory" ؛
يمكنك استخدام الطريقة التي طورتها لإنشاء منتدى بدلاً من com.jivesoftware.forum.database.dbforumFactory.
في الكود أعلاه ، هناك ثلاثة أوضاع. منتدى الوصول: واحد إذا كنت مستخدمًا مسجلاً وضيفًا ، فستكون الأذونات المقابلة مختلفة ، وسيتم تشغيل هذا الإذن عبر النظام بأكمله.
تحقق من CatalogdaoFactory في متجر Java Pet:
نسخة الكود كما يلي:
الطبقة العامة catalogdaofactory {
/**
* تقوم هذه الطريقة بتطوير فئة فرعية خاصة لتنفيذ نمط DAO.
* تعريف الفئة الفرعية المحددة في واصف نشر J2EE.
*/
Catalogdao getdao () ثابتة عامة في CatalogdaosySexception {
Catalogdao catdao = null ؛
يحاول {
initialContext ic = new initialContext () ؛
// التحميل الديناميكي لـ Catalog_dao_class
// يمكنك تحديد Catalog_dao_class ، بحيث لا تحتاج إلى تغيير الكثير من التعليمات البرمجية
// ، أكمل تغييرات النظام الضخم.
سلسلة className = (String) ic.lookup (jndinames.catalog_dao_class) ؛
Catdao = (Catalogdao) class.forname (className) .NewInstance () ؛
} catch (NamingException ne) {
رمي catalogdaoSexception ("catalogdaofactory.getdao: NamingException أثناء الحصول على نوع dao: /n" + ne.getMessage ()) ؛
} catch (استثناء SE) {
رمي catalogdaoSexception ("catalogdaofactory.getdao: استثناء أثناء الحصول على نوع dao: /n" + se.getMessage ()) ؛
}
إرجاع Catdao ؛
}
}
Catalogdaofactory هي طريقة مصنع نموذجية. .
يمكن ملاحظة أن طريقة المصنع توفر آلية توسيع ديناميكية مرنة وقوية للغاية لهيكل النظام. من الممكن تغيير وظائف النظام في التحول.