0Pricing
Java Academy · درس

نمط Factory Method

عرّف أسلوب مصنع في فئة أساسية، ودَع الفئات الفرعية تحدد المنتج الذي ستنشئه

نمط Factory Method درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

نية Factory Method

يعرّف Factory Method واجهةً لإنشاء كائن، لكنه يتيح للفئات الفرعية تحديد الفئة التي يجب إنشاء نسخة منها. ويفصل منطق الإنشاء عن شيفرة العميل.

المشكلة من دون Factory Method

من دون مصنع، تمتلئ شيفرة العميل باستدعاءات new ConcreteClass(). وإضافة متغير جديد تعني تغيير كل مواضع الاستدعاء، وهو ما يخالف مبدأ الانفتاح والإغلاق.

// Client knows too much:
Shape shape;
if (type.equals("circle")) shape = new Circle(r);
else if (type.equals("rect")) shape = new Rectangle(w, h);
// Every new shape requires editing this code.

الفئة المجردة المُنشئة

عرّف فئة مُنشئة مجردة تحتوي على طريقة المصنع createProduct(). وتعيد الفئات الفرعية تعريفها لإرجاع أنواع محددة من المنتجات.

public abstract class Dialog {
    public void render() {
        Button btn = createButton(); // factory method
        btn.onClick();
    }
    protected abstract Button createButton();
}

المُنشئون الفعليون

تعيد كل فئة فرعية تعريف طريقة المصنع لإرجاع المنتج المناسب، من دون تغيير الخوارزمية المحيطة في الفئة الأساسية.

public class WindowsDialog extends Dialog {
    @Override
    protected Button createButton() { return new WindowsButton(); }
}
public class WebDialog extends Dialog {
    @Override
    protected Button createButton() { return new HtmlButton(); }
}

واجهة المنتج

تنفّذ جميع المنتجات الفعلية واجهةً مشتركة، بحيث يستطيع المُنشئ التعامل معها بطريقة عامة.

public interface Button {
    void onClick();
    void render();
}
public class WindowsButton implements Button {
    public void onClick() { System.out.println("Windows click"); }
    public void render() { System.out.println("Render Windows button"); }
}

طرق المصنع static مقابل نمط Factory Method

طريقة المصنع static، مثل LocalDate.of()، هي اصطلاح تسمية وليست نمط GoF. يستخدم نمط GoF التوريث، بينما تستخدم المصانع static طرقًا static في فئة واحدة.

// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchy

طريقة المصنع ذات المعامل

مرّر معاملًا إلى طريقة المصنع للاختيار بين عدة منتجات، من دون الحاجة إلى فئة فرعية لكل منتج.

public class ShapeFactory {
    public static Shape create(String type, double... dims) {
        return switch (type) {
            case "circle"    -> new Circle(dims[0]);
            case "rectangle" -> new Rectangle(dims[0], dims[1]);
            default -> throw new IllegalArgumentException("Unknown: " + type);
        };
    }
}

Factory Method مع الأنواع العامة

استخدم الأنواع العامة لجعل طريقة المصنع آمنة نوعيًا وقابلة لإعادة الاستخدام مع عائلات مختلفة من المنتجات.

public abstract class Repository<T, ID> {
    public abstract T findById(ID id);
    protected abstract T createEmpty(); // factory method
}

تسجيل المصانع باستخدام Map

يخزّن المصنع المعتمد على سجل خريطةً تربط سلاسل الأنواع بعبارات lambda من نوع Supplier، متجنبًا سلاسل if-else ومتيحًا التسجيل الديناميكي.

Map<String, Supplier<Notification>> registry = new HashMap<>();
registry.put("email", EmailNotification::new);
registry.put("sms",   SmsNotification::new);
Notification n = registry.getOrDefault(type, DefaultNotification::new).get();

Factory Method مقابل Abstract Factory

ينشئ Factory Method نوعًا واحدًا من المنتجات باستخدام التوريث. أما Abstract Factory فينشئ عائلات من المنتجات المترابطة باستخدام التركيب. استخدم Factory Method عندما يتغير منتج واحد، وAbstract Factory عندما تتغير مجموعة كاملة معًا.

مثال من العالم الحقيقي: مصنع Logger

إن LoggerFactory.getLogger(Class) في SLF4J هو مصنع static يعيد تطبيق logger الصحيح، مثل Logback أو Log4j أو JUL، من دون أن يعرف المستدعي أيّ تطبيق استُخدم.

Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");

تحقق سريع

ما السمة الأساسية لنمط Factory Method؟

مراجعة

يفصل Factory Method إنشاء الكائن عن العميل، إذ يضع قرار إنشاء النسخة في طرق الفئات الفرعية القابلة لإعادة التعريف. استخدمه عندما لا تستطيع الفئة توقّع الكائنات التي ستحتاج إلى إنشائها.

الأسئلة الشائعة

هل درس «نمط Factory Method» مجاني؟

نعم — نص درس «نمط Factory Method» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «نمط Factory Method»؟

عرّف أسلوب مصنع في فئة أساسية، ودَع الفئات الفرعية تحدد المنتج الذي ستنشئه تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.

كم من الوقت يستغرق درس «نمط Factory Method»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. Singleton: تطبيقات آمنة للخيوط
  2. نمط Factory Method
  3. Abstract Factory لعائلات المنتجات
  4. نمط Builder مع Fluent API
← العودة إلى Java Academy