اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

نمط ال Abstract Factory هو أحد أنماط التصميم المستخدمة في البرمجة الكائنية لتطبيقه يمكن أن نأخذ مثالا بيسيط وعمليا لكن قبل ذلك يجب أن نفهم أولا كيفية تطبيق النمط أولا نقوم بتحديد واجهتين (أو فئات مجردة) تمثل العائلات المختلفة من الكائنات ثم يجب إنشاء الفئات التي تنفذ هذه الواجهات بعدها يأتي الدور على إنشاء المصنع أين يجب أن تنشئ مصنعا Factory يمكنه إنشاء كائنات من الفئات المحددة وهذا مثال لنفترض أننا نريد إنشاء واجهات مستخدم مختلفة لنظامين وليكونا نظام Windows ونظام macOS:

from abc import ABC, abstractmethod

# واجهة للزر
class Button(ABC):
    @abstractmethod
    def paint(self):
        pass

# واجهة لواجهة المستخدم
class GUIFactory(ABC):
    @abstractmethod
    def create_button(self) -> Button:
        pass

# تنفيذ للزر في Windows
class WindowsButton(Button):
    def paint(self):
        return "Windows Button"

# تنفيذ للزر في macOS
class MacOSButton(Button):
    def paint(self):
        return "MacOS Button"

# مصنع Windows
class WindowsFactory(GUIFactory):
    def create_button(self) -> Button:
        return WindowsButton()

# مصنع macOS
class MacOSFactory(GUIFactory):
    def create_button(self) -> Button:
        return MacOSButton()

# استخدام المصنع
def client_code(factory: GUIFactory):
    button = factory.create_button()
    print(button.paint())

# اختيار المصنع
windows_factory = WindowsFactory()
client_code(windows_factory)

mac_factory = MacOSFactory()
client_code(mac_factory)

هذه الشيفرة ستستخدم نموذج المصنع المجرد (Abstract Factory) لإنشاء أزرار لواجهة المستخدم لنظامي التشغيل بحيث يحتوي على واجهات تحدد كيفية إنشاء الأزرار (Button و GUIFactory)، وفئات تقوم بتنفيذ هذه الواجهات (مثل WindowsButton و MacOSButton) ويقوم كل مصنع سواء WindowsFactory أو MacOSFactory بإنشاء نوع محدد من الأزرار في الأخير الدالة client_code تستخدم هذه المصانع لإنشاء الأزرار ثم طباعتها.

  • 0
نشر

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

from abc import ABC, abstractmethod

# واجهة الكرسي
class Chair(ABC):
    @abstractmethod
    def sit_on(self):
        pass

# واجهة الطاولة
class Table(ABC):
    @abstractmethod
    def eat_on(self):
        pass

ثم تعرف الفئات التي تنفذ الواجهات:

# كراسي حديثة
class ModernChair(Chair):
    def sit_on(self):
        return "Sitting on a modern chair."

# طاولات حديثة
class ModernTable(Table):
    def eat_on(self):
        return "Eating on a modern table."

# كراسي كلاسيكية
class ClassicChair(Chair):
    def sit_on(self):
        return "Sitting on a classic chair."

# طاولات كلاسيكية
class ClassicTable(Table):
    def eat_on(self):
        return "Eating on a classic table."

ثم إنشاء المصنع المجرد:

class FurnitureFactory(ABC):
    @abstractmethod
    def create_chair(self) -> Chair:
        pass
    
    @abstractmethod
    def create_table(self) -> Table:
        pass

و المصانع الملموسة:

# مصنع الأثاث الحديث
class ModernFurnitureFactory(FurnitureFactory):
    def create_chair(self) -> Chair:
        return ModernChair()

    def create_table(self) -> Table:
        return ModernTable()

# مصنع الأثاث الكلاسيكي
class ClassicFurnitureFactory(FurnitureFactory):
    def create_chair(self) -> Chair:
        return ClassicChair()

    def create_table(self) -> Table:
        return ClassicTable()

و في الأخير تستخدمهم بهذا الشكل:

def client_code(factory: FurnitureFactory):
    chair = factory.create_chair()
    table = factory.create_table()

    print(chair.sit_on())
    print(table.eat_on())

# استخدام مصنع الأثاث الحديث
modern_factory = ModernFurnitureFactory()
client_code(modern_factory)

# استخدام مصنع الأثاث الكلاسيكي
classic_factory = ClassicFurnitureFactory()
client_code(classic_factory)

و يمكنك أن تطلع أكثر على كيف يعمل بالضبط من خلال هذه المقالة :

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...