تخطَّ إلى المحتوى

🧩 شرح أنماط التصميم (Design Patterns)

نمط Factory (Simple + Factory Method)

الدرس 5 من 28· ⏱ 3 دقائق قراءة· 🗓 آخر تحديث: ١٦ أكتوبر ٢٠٢٦

ما هو نمط Factory؟

نمط Factory هو نمط إبداعي (Creational) يوفّر واجهة لإنشاء الكائنات دون كشف منطق الإنشاء للكود المستخدم.

Simple Factory

ليست نمطًا رسميًا من Gang of Four لكنها خطوة أولى.

// Simple Factory
class NotificationFactory {
  static createNotification(type) {
    switch (type) {
      case 'email':
        return new EmailNotification();
      case 'sms':
        return new SMSNotification();
      case 'push':
        return new PushNotification();
      default:
        throw new Error('نوع إشعار غير معروف');
    }
  }
}

class EmailNotification { send(msg) { console.log(`📧 ${msg}`); } }
class SMSNotification { send(msg) { console.log(`📱 ${msg}`); } }
class PushNotification { send(msg) { console.log(`🔔 ${msg}`); } }

// الاستخدام
const notif = NotificationFactory.createNotification('email');
notif.send('مرحبًا!');

Factory Method

يسمح للكلاسات الفرعية بتحديد نوع الكائن الذي سيتم إنشاؤه.

// Creator
class Dialog {
  createButton() {
    throw new Error('يجب تنفيذ createButton');
  }

  render() {
    const button = this.createButton();
    button.onClick(() => console.log('تم الضغط'));
    button.render();
  }
}

// Product
class Button {
  render() {}
  onClick(fn) {}
}

// Concrete Products
class WindowsButton extends Button {
  render() { console.log('🪟 زر ويندوز'); }
}

class WebButton extends Button {
  render() { console.log('🌐 زر ويب'); }
}

class MobileButton extends Button {
  render() { console.log('📱 زر موبايل'); }
}

// Concrete Creators
class WindowsDialog extends Dialog {
  createButton() { return new WindowsButton(); }
}

class WebDialog extends Dialog {
  createButton() { return new WebButton(); }
}

class MobileDialog extends Dialog {
  createButton() { return new MobileButton(); }
}

// الاستخدام — إنشاء الحوار المناسب حسب النظام
const dialog = new WindowsDialog();
dialog.render(); // 🪟 زر ويندوز

Simple Factory أم Factory Method؟

  • Simple Factory: دالة واحدة فيها switch أو if/else على النوع. كافية ما دامت الأنواع قليلة وثابتة، لكن كل نوع جديد يعني تعديل هذه الدالة.
  • Factory Method: الصنف الأب يعرّف دالة الإنشاء، وكل صنف فرعي يقرّر ما ينشئه. إضافة نوع جديد = صنف فرعي جديد بدون تعديل الكود القائم (مبدأ Open/Closed).

ابدأ بـ Simple Factory، وانتقل لـ Factory Method حين تجد نفسك تعدّل الـ switch نفسه مرارًا.

الفرق عن Abstract Factory: Factory Method ينشئ نوعًا واحدًا من الكائنات (زر)، وAbstract Factory ينشئ عائلة كائنات متوافقة معًا (زر + حقل نص + قائمة بنفس المظهر).

متى تستخدمه؟

  • عندما لا تعرف الأنواع الدقيقة للكائنات التي يحتاجها كودك مسبقًا
  • عندما تريد توفير طريقة عامة لإنشاء الكائنات مع ترك التفاصيل للكلاسات الفرعية
  • عندما تريد تجنب ربط الكود بكلاسات معينة

⚠️ Simple Factory قد يكبر ويتحول إلى God Class—حاول فصل المسؤوليات عندما يكثر عدد الأنواع.

from abc import ABC, abstractmethod

class Button(ABC):
    @abstractmethod
    def render(self):
        pass

class WindowsButton(Button):
    def render(self):
        print("زر ويندوز 🪟")

class Dialog(ABC):
    @abstractmethod
    def create_button(self):
        pass

    def render(self):
        btn = self.create_button()
        btn.render()

class WindowsDialog(Dialog):
    def create_button(self):
        return WindowsButton()

dialog = WindowsDialog()
dialog.render()   # زر ويندوز 🪟

🎯 التالي: نمط Abstract Factory

شرح نمط Factory (Simple + Factory Method) — أنماط التصميم (Design Patterns) بالعربي
نمط Factory (Simple + Factory Method) — أنماط التصميم (Design Patterns) بالعربي · The Code Fix

📚 لمزيد من التعمّق في أنماط التصميم (Design Patterns)، راجِع البرمجة الكائنية على ويكيبيديا.

هل كان هذا الدرس مفيدًا؟