"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > مصنع بسيط

مصنع بسيط

تم النشر بتاريخ 2024-11-17
تصفح:163

ما هو المصنع البسيط؟

المصنع البسيط ليس نمط تصميم. إنه ببساطة يفصل إنشاء الكائن عن رمز العميل. بمعنى آخر، يقوم 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().

Simple Factory

  1. عميل
    يقوم العميل بإنشاء كائن برجر محدد من خلال SimpleBurgerFactory. لاحظ من وجهة نظر العميل، أننا لا نعرف أي برجر ملموس سيتم إنشاؤه، أي أن منطق إنشاء الكائن منفصل الآن عن العميل.

  2. سيمبل برجر فاكتوري
    تحتوي هذه الفئة على ما يختلف وهو في هذه الحالة منطق إنشاء الكائن! تم تعريف createBurger() كطريقة ثابتة لأن العميل يريد استخدام هذه الفئة لإنشاء مثيل للكائن (بالطبع لا يمكننا الحصول على مثيل قبل إنشاء مثيل له!). يقبل createBurger() تعداد BurgerType لتحديد نوع البرجر الذي يجب إنشاؤه.

  3. برجر
    توفر هذه الفئة المجردة واجهة مشتركة بين جميع أنواع البرجر وتحدد السلوكيات الافتراضية.

  4. فئات البرجر الفرعية
    هنا منتجاتنا الخرسانية. يمكنهم تنفيذ سلوك معين عن طريق تجاوز الأساليب طالما أنها توسع فئة برجر.

بناء

Simple Factory

شفرة

public enum BurgerType {
    BEEF,
    CHICKEN,
    FISH,
    VEGGIE
}
// Abstract Product
public abstract class Burger {

    public BurgerType burgerType;
    public List toppings = 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;
        List items = List.of("lettuce", "pickle slices", "tomato slice", "BBQ sauce");
        toppings.addAll(items);
    }
}
// Concrete product
public class VeggieBurger extends Burger {

    public VeggieBurger() {
        burgerType = BurgerType.VEGGIE;
        List items = 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

المزالق

  • يمكن أن يكون كود اتخاذ القرار لإنشاء مثيل للكائن أكثر تعقيدًا في وقت ما. في مثل هذه الحالة، قد نفكر أيضًا في استخدام طريقة المصنع بدلاً من ذلك.

مقارنة مع نمط المصنع

  • في المصنع البسيط، عادةً ما تكون هناك فئة مصنع واحدة لتحديد نوع المنتج المراد إنشاؤه، بينما قد يقدم نمط المصنع مصانع متعددة.
  • غالبًا ما يستخدم المصنع البسيط طريقة ثابتة لإنشاء الكائنات، مما يجعل من السهل الاتصال بها ولكن من الصعب توسيعها. من ناحية أخرى، تستخدم طريقة المصنع الطريقة المجردة في الفئة الفائقة، والتي تعمل كواجهة لجميع المصانع والفئات الفرعية وستوفر تنفيذًا ملموسًا لإنشاء مثيل للكائن.

يمكنك التحقق من جميع تطبيقات نمط التصميم هنا.
مستودع جيثب


ملاحظة
أنا جديد في كتابة مدونة تقنية، إذا كانت لديك نصيحة لتحسين كتابتي، أو كانت لديك أي نقطة مربكة، فيرجى ترك تعليق!
شكرا لقرائتكم :)

بيان الافراج تم نشر هذه المقالة على: https://dev.to/sota_333ad4b72095606ab40c/simple-factory-3bnl?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3