المصنع البسيط ليس نمط تصميم. إنه ببساطة يفصل إنشاء الكائن عن رمز العميل. بمعنى آخر، يقوم Simple Factory بتغليف إنشاء مثيل للكائن عن طريق نقل منطق إنشاء مثيل إلى فئة منفصلة.
غالبًا ما يتم الخلط بين المصنع البسيط ونمط المصنع. سنقوم بدراسة المصنع البسيط لتوضيح الفرق بينهما. كما أن تعلم المصنع البسيط يساعدنا على فهم نمط المصنع بسهولة.
يجب تجنب برمجة التنفيذ الملموس لأنه يجعل صيانة التطبيق صعبة للغاية. من الأفضل دائمًا استخدام البرنامج للواجهة. إذا كنت تقوم بإنشاء فئة محددة في كود العميل، فإن Simple Factory يكون مفيدًا حيث يمكن لـ Simple Factory فصل إنشاء الكائن عن العميل. وهذا يجعل تطبيقنا أكثر قابلية للتوسيع والصيانة.
نحن نعمل على تطوير نظام لمتجر برجر. يحتاج النظام إلى إنشاء أنواع مختلفة من البرجر مثل برجر اللحم البقري وبرجر الدجاج وما إلى ذلك.
محاولتنا الأولى ستكون هكذا:
// Client orders a burger Burger orderBurger(String type) { Burger burger; if (type.equals("beef")) { burger = new BeefBurger(); } else if (type.equals("chicken")) { burger = new ChickenBurger(); } else if (type.equals("fish")) { burger = new FishBurger(); } burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; }
المشكلة هي أننا نقوم بالترميز للتنفيذ وليس للواجهة. أين؟ نستخدم عبارة if وننشئ فئة محددة بناءً على نوع البرجر.
لماذا هي المشكلة؟ رمز العميل الخاص بنا مقترن بشكل وثيق بإنشاء الكائن، مما يؤدي إلى مرونة أقل!! لنفترض أننا إذا توقفنا عن بيع برجر السمك بعد الآن، وبدأنا في بيع برجر الخضروات. نحن بحاجة لزيارة رمز العميل لدينا وتعديله. وهذا يعني أنه غير مغلق للتعديل.
لحل المشكلة، يمكننا إنشاء فئة منفصلة والتي ستكون مسؤولة فقط عن إنشاء الكائن. إذن، لا داعي للقلق بشأن إنشاء الكائن وأن يكون قادرًا على الاعتماد على التجريد. تُعرف هذه التقنية باسم "تغليف ما يختلف". نتوقع أن يتم تغيير التعليمات البرمجية الخاصة بإنشاء كائنات ملموسة بشكل متكرر، بينما من المرجح أن تظل عمليات PreparBun() وgrillPatty() وaddToppings() وwrap() كما هي بين جميع أنواع البرغر في المستقبل.
ميزة المصنع البسيط هي أنه قابل لإعادة الاستخدام من قبل فئات أخرى. قد يكون لدينا فئات عملاء أخرى مثل BurgerRestaurant وBurgerCateringShop والتي ستستخدم طريقة SimpleBurgerFactory.createBurger().
عميل
يقوم العميل بإنشاء كائن برجر محدد من خلال SimpleBurgerFactory. لاحظ من وجهة نظر العميل، أننا لا نعرف أي برجر ملموس سيتم إنشاؤه، أي أن منطق إنشاء الكائن منفصل الآن عن العميل.
سيمبل برجر فاكتوري
تحتوي هذه الفئة على ما يختلف وهو في هذه الحالة منطق إنشاء الكائن! تم تعريف createBurger() كطريقة ثابتة لأن العميل يريد استخدام هذه الفئة لإنشاء مثيل للكائن (بالطبع لا يمكننا الحصول على مثيل قبل إنشاء مثيل له!). يقبل createBurger() تعداد BurgerType لتحديد نوع البرجر الذي يجب إنشاؤه.
برجر
توفر هذه الفئة المجردة واجهة مشتركة بين جميع أنواع البرجر وتحدد السلوكيات الافتراضية.
فئات البرجر الفرعية
هنا منتجاتنا الخرسانية. يمكنهم تنفيذ سلوك معين عن طريق تجاوز الأساليب طالما أنها توسع فئة برجر.
public enum BurgerType { BEEF, CHICKEN, FISH, VEGGIE }
// Abstract Product public abstract class Burger { public BurgerType burgerType; public Listtoppings = new ArrayList(); public void prepareBun() { System.out.println("Preparing a bun"); } public void grillPatty() { if (burgerType == null) { throw new IllegalStateException("pattyType is undefined"); } System.out.println("Grill a " burgerType " patty"); } public void addToppings() { for (String item : toppings) { System.out.println("Add " item); } } public void wrap() { System.out.println("Wrap a burger up"); } }
// Concrete product public class BeefBurger extends Burger { public BeefBurger() { burgerType = BurgerType.BEEF; Listitems = List.of("lettuce", "pickle slices", "tomato slice", "BBQ sauce"); toppings.addAll(items); } }
// Concrete product public class VeggieBurger extends Burger { public VeggieBurger() { burgerType = BurgerType.VEGGIE; Listitems = List.of("smoked paprika", "garlic chips", "crushed walnuts", "veggie sauce"); toppings.addAll(items); } // Concrete product can implement specific behavior that differs from other products @Override public void wrap() { System.out.println("Wrapping paper shouldn't print any meats but vegetables"); } }
// Simple factory, responsible for instantiating an object public class SimpleBurgerFactory { public static Burger createBurger(BurgerType type) { return switch (type) { case BEEF -> new BeefBurger(); case CHICKEN -> new ChickenBurger(); case FISH -> new FishBurger(); case VEGGIE -> new VeggieBurger(); default -> throw new IllegalArgumentException("unknown burger type"); }; } }
public class Client { public static void main(String[] args) { Burger burger = orderBurger(BurgerType.VEGGIE); System.out.println(burger); // Check if the object is actually veggie burger } public static Burger orderBurger(BurgerType type) { // Factory is responsible for object creation Burger burger = SimpleBurgerFactory.createBurger(type); burger.prepareBun(); burger.grillPatty(); burger.addToppings(); burger.wrap(); return burger; } }
الإخراج:
Preparing a bun Grill a VEGGIE patty Add smoked paprika Add garlic chips Add crushed walnuts Add veggie sauce Wrapping paper shouldn't print any meats but vegetables com.factories.simpleFactory.VeggieBurger@9807454
يمكنك التحقق من جميع تطبيقات نمط التصميم هنا.
مستودع جيثب
ملاحظة
أنا جديد في كتابة مدونة تقنية، إذا كانت لديك نصيحة لتحسين كتابتي، أو كانت لديك أي نقطة مربكة، فيرجى ترك تعليق!
شكرا لقرائتكم :)
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3