Abstract Factory لعائلات المنتجات
أنشئ عائلات من الكائنات المترابطة، مثل مكوّنات UI لكل منصة، باستخدام Abstract Factory
Abstract Factory لعائلات المنتجات درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.
نية Abstract Factory
يوفّر Abstract Factory واجهةً لإنشاء عائلات من الكائنات المترابطة، من دون تحديد فئاتها الفعلية. ويضمن توافق المنتجات الصادرة عن مصنع واحد.
المشكلة: عائلات المنتجات غير المتسقة
من دون Abstract Factory، قد تخلط بين زر Windows ومربع اختيار Mac. يفرض النمط أن تأتي جميع المنتجات من المصنع نفسه، مما يضمن الاتساق المرئي أو السلوكي.
واجهة Abstract Factory
عرّف واجهةً تحتوي على طريقة إنشاء لكل منتج في العائلة. وينفّذ كل مصنع فعلي جميع الطرق الخاصة بمتغير واحد.
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
TextField createTextField();
}المصانع الفعلية
ينشئ كل مصنع فعلي جميع المنتجات الخاصة بمنصة أو سمة واحدة. ولا تشير شيفرة العميل إلا إلى الواجهة، لا إلى المصانع الفعلية.
public class WindowsUIFactory implements UIFactory {
public Button createButton() { return new WindowsButton(); }
public Checkbox createCheckbox() { return new WindowsCheckbox(); }
public TextField createTextField() { return new WindowsTextField(); }
}
public class MacUIFactory implements UIFactory {
public Button createButton() { return new MacButton(); }
public Checkbox createCheckbox() { return new MacCheckbox(); }
public TextField createTextField() { return new MacTextField(); }
}واجهات المنتجات المجردة
يمتلك كل نوع من المنتجات واجهته الخاصة. وتنفّذ المنتجات الفعلية هذه الواجهة لكل منصة. وتتعامل شيفرة العميل مع المنتج المجرد، لا مع المنتج الفعلي.
public interface Button { void render(); void onClick(); }
public interface Checkbox { void render(); boolean isChecked(); }
public interface TextField { void render(); String getValue(); }العميل الذي يستخدم المصنع
يتلقى العميل مصنعًا عبر مُنشئه. ويستدعي طرق المصنع لإنشاء عناصر الواجهة، ثم يستخدمها عبر واجهات المنتجات المجردة، مع فصل كامل عن الفئات الفعلية.
public class Application {
private final UIFactory factory;
public Application(UIFactory factory) { this.factory = factory; }
public void buildUI() {
Button btn = factory.createButton();
Checkbox cb = factory.createCheckbox();
btn.render();
cb.render();
}
}اختيار المصنع في وقت التشغيل
حدّد المصنع الفعلي استنادًا إلى البيئة أو الإعدادات، ثم مرّره إلى التطبيق. ولن تشير بقية أجزاء التطبيق مطلقًا إلى الفئات الخاصة بمنصة معينة.
String os = System.getProperty("os.name").toLowerCase();
UIFactory factory = os.contains("mac") ? new MacUIFactory() : new WindowsUIFactory();
new Application(factory).buildUI();إضافة منتج جديد إلى العائلة
تتطلب إضافة منتج جديد، مثل Slider، تحديث واجهة المصنع المجرد وجميع المصانع الفعلية، وهذا أحد عيوب النمط.
public interface UIFactory {
Button createButton();
Checkbox createCheckbox();
Slider createSlider(); // new product — must update ALL factories
}Abstract Factory مقابل Factory Method
ينشئ Factory Method منتجًا واحدًا باستخدام التوريث، بينما ينشئ Abstract Factory مجموعة منتجات باستخدام التركيب. ويُنفّذ Abstract Factory عادةً باستخدام مجموعة من طرق Factory Method.
Abstract Factory لمحركات قواعد البيانات
يمكن لمصنع مجرد من نوع ConnectionFactory إنتاج كائنات من أنواع Connection وStatement وResultSet. ويمكن التبديل بين MySQL وPostgreSQL بتغيير المصنع.
public interface DBFactory {
Connection createConnection();
Statement createStatement();
}
public class MySQLFactory implements DBFactory { ... }
public class PgFactory implements DBFactory { ... }Abstract Factory مع ملفات تعريف Spring
في Spring Boot، عرّف bean من نوع UIFactory بطريقة مختلفة لكل ملف تعريف: يحقن التطبيق دائمًا UIFactory، بينما يحل Spring المصنع الفعلي الصحيح لملف التعريف النشط.
@Configuration
@Profile("mac")
public class MacConfig {
@Bean UIFactory uiFactory() { return new MacUIFactory(); }
}ضمان الاتساق
الفائدة الأساسية هي أن المصنع لا ينتج إلا منتجات متوافقة. وعند استخدام Abstract Factory بطريقة صحيحة، لا يمكن الحصول بالخطأ على مربع اختيار Mac مقترن بزر Windows.
تحقق سريع
ما الذي يضمنه Abstract Factory ولا يضمنه Factory Method؟
مراجعة
ينشئ Abstract Factory عائلات من الكائنات المترابطة عبر واجهة مشتركة. ويمكن تبديل عائلات المنتجات بأكملها بتغيير المصنع. يكون مناسبًا عندما يجب أن تتسق المنتجات، لكنه يضيف عبئًا عند إضافة أنواع منتجات جديدة.
الأسئلة الشائعة
هل درس «Abstract Factory لعائلات المنتجات» مجاني؟
نعم — نص درس «Abstract Factory لعائلات المنتجات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.
ماذا ستتعلم في «Abstract Factory لعائلات المنتجات»؟
أنشئ عائلات من الكائنات المترابطة، مثل مكوّنات UI لكل منصة، باستخدام Abstract Factory تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟
لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «Abstract Factory لعائلات المنتجات»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟
نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- Singleton: تطبيقات آمنة للخيوط
- نمط Factory Method
- Abstract Factory لعائلات المنتجات
- نمط Builder مع Fluent API