جافا: نمط أسلوب تصميم المصنع | تصميم كائني التوجه | أنماط التصميم
نشرت: 2013-06-28 يعد نمط تصميم المصنع أحد أنماط التصميم الإبداعي ويستخدم على نطاق واسع في JDK بالإضافة إلى أطر مثل Spring MVC و Struts. نمط أسلوب المصنع هو نمط تصميم إبداعي موجه للكائنات لتنفيذ مفهوم المصانع ويتعامل مع مشكلة إنشاء كائنات (منتجات) دون تحديد فئة الكائن التي سيتم إنشاؤها بالضبط. يتمثل جوهر هذا النمط في " تحديد واجهة لإنشاء كائن ، ولكن دع الفئات التي تنفذ الواجهة تحدد الفئة التي سيتم إنشاء مثيل لها. يتيح أسلوب المصنع لفئة إرجاء إنشاء مثيل للفئات الفرعية ".
دعنا نتعلم أولاً كيفية تنفيذ نمط المصنع في جافا. سننشئ 5 فئات لتنفيذ هذا النمط.
- سوبر كلاس (CrunchfiyCompany.java)
- يمكن أن تكون الفئة الفائقة في نمط المصنع عبارة عن واجهة أو فئة مجردة أو فئة جافا عادية. على سبيل المثال ، لدينا فئة فائقة كفئة مجردة مع طريقة
toString()
التي تم تجاوزها لغرض الاختبار.
- يمكن أن تكون الفئة الفائقة في نمط المصنع عبارة عن واجهة أو فئة مجردة أو فئة جافا عادية. على سبيل المثال ، لدينا فئة فائقة كفئة مجردة مع طريقة
- الفئة الفرعية 1 (CrunchifyEbay.java)
- لاحظ أن الفصل يقوم بتوسيع فئة CrunchfiyCompany.
- Sub Class2 (CrunchifyGoogle.java)
- لاحظ أن الفصل يقوم بتوسيع فئة CrunchfiyCompany.
- فئة المصنع (CrunchifyFactoryPattern.java)
- الآن بعد أن أصبح لدينا فئات فائقة وفئات فرعية جاهزة ، يمكننا كتابة فئة المصنع.
- يمكننا الاحتفاظ بفئة المصنع Singleton أو يمكننا الحفاظ على الطريقة التي تُرجع الفئة الفرعية ثابتة.
- لاحظ أنه بناءً على معلمة الإدخال ، يتم إنشاء وإرجاع فئة فرعية مختلفة.
- فئة الاختبار (CrunchifyFactoryPatternTest.java)
- برنامج عميل اختبار بسيط يستخدم تطبيق نمط المصنع أعلاه.
يجب أن يقرأ الآخر:
- Thread-Safe وتنفيذ فردي سريع في Java
- ما هو خيط الشيطان في جافا؟ مثال مرفق
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Super class in factory pattern can be an interface, abstract class or a // normal java class. For our example, we have super class as abstract class // with overridden toString() method for testing purpose. public abstract class CrunchfiyCompany { public abstract String getPhoneNumber ( ) ; public abstract String getZipCode ( ) ; @Override public String toString ( ) { return "Phone #= " + this . getPhoneNumber ( ) + ", Zip Code= " + this . getZipCode ( ) ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyEbay extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyEbay ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com . crunchify . tutorials ; /** * @author Crunchify.com */ // Notice that the class is extending CrunchfiyCompany class. public class CrunchifyGoogle extends CrunchfiyCompany { private String phoneNumber ; private String zipCode ; public CrunchifyGoogle ( String phoneNumber , String zipCode ) { this . phoneNumber = phoneNumber ; this . zipCode = zipCode ; } @Override public String getPhoneNumber ( ) { return this . phoneNumber ; } @Override public String getZipCode ( ) { return this . zipCode ; } } |

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyEbay ; import com . crunchify . tutorials . CrunchifyGoogle ; /** * @author Crunchify.com */ // Now that we have super classes and sub-classes ready, we can write our factory class. // We can keep Factory class Singleton or we can keep the method that return the subclass a static. // Notice that based on the input parameter, different subclass is created and returned. public class CrunchifyFactoryPattern { public static CrunchfiyCompany getDetails ( String type , String phoneNumber , String zipCode ) { if ( "Ebay" . equalsIgnoreCase ( type ) ) return new CrunchifyEbay ( phoneNumber , zipCode ) ; else if ( "Google" . equalsIgnoreCase ( type ) ) return new CrunchifyGoogle ( phoneNumber , zipCode ) ; return null ; } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
package com . crunchify . tutorials ; import com . crunchify . tutorials . CrunchfiyCompany ; import com . crunchify . tutorials . CrunchifyFactoryPattern ; /** * @author Crunchify.com */ // Simple Test client program that uses above factory pattern implementation. public class CrunchifyFactoryPatternTest { public static void main ( String [ ] args ) { CrunchfiyCompany eBay = CrunchifyFactoryPattern . getDetails ( "Ebay" , "408.123.4567" , "98765" ) ; CrunchfiyCompany google = CrunchifyFactoryPattern . getDetails ( "Google" , "519.123.4567" , "56789" ) ; System . out . println ( "Factory eBay Config::" + eBay ) ; System . out . println ( "Factory Google Config::" + google ) ; } } |
1 2 |
Factory eBay Config : : Phone #= 408.123.4567, Zip Code= 98765 Factory Google Config : : Phone #= 519.123.4567, Zip Code= 56789 |
أمثلة أخرى باستخدام نمط المصنع؟
- تستخدم طرق java.util.Calendar و ResourceBundle و NumberFormat
getInstance()
نمط المصنع. - طريقة
valueOf()
في فئات مجمعة مثل Boolean و Integer وما إلى ذلك.
فوائد نمط المصنع:
- يتم استخدامه عندما يكون لدينا فئة فائقة بها فئات فرعية متعددة وبناءً على المدخلات ، نحتاج إلى إرجاع فئة فرعية. يأخذ هذا النمط مسؤولية إنشاء مثيل لفئة من برنامج العميل إلى فئة المصنع.
- يوفر نمط المصنع نهجًا للتعليمات البرمجية للواجهة بدلاً من التنفيذ.
- يزيل نمط المصنع إنشاء مثيل لفئات التنفيذ الفعلية من كود العميل ، مما يجعله أكثر قوة وأقل اقترانًا وسهل التوسيع. على سبيل المثال ، يمكننا بسهولة تغيير تطبيق فئة الكمبيوتر الشخصي لأن برنامج العميل غير مدرك لذلك.
- يوفر نمط المصنع التجريد بين فئات التنفيذ والعميل من خلال الوراثة.
عيوب:
- يجب استخدام المصنع لمجموعة من الأشياء. إذا لم تمد الفئات فئة أساسية مشتركة أو واجهة ، فلا يمكن استخدامها في قالب تصميم المصنع.
قائمة بجميع برامج تطوير الويب Java ، دروس Spring MVC.