وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

الگوی طراحی انتزاعی کارخانه در پایتون

0 3
زمان لازم برای مطالعه: 5 دقیقه


معرفی

الگوهای طراحی به درک، مقیاس پذیر و قابل استفاده مجدد کد کمک می کند. بسته به الگوهای طراحی، دسته بندی های مختلفی وجود دارد روی مشکلات در حال رسیدگی وقتی کد مدولار می شود، اضافه کردن ویژگی های جدیدتر بدون ایجاد تغییرات شدید در پروژه آسان تر است.

را الگوی طراحی کارخانه انتزاعی یک الگوی ایجادی است که چارچوبی برای ایجاد رابط های اشیاء نزدیک به هم بدون مشخص کردن کلاس های آنها فراهم می کند – از این رو اصطلاح “خلاصه”.

یک کلاس انتزاعی تا حدی پیاده‌سازی می‌شود و الزاماتی را که کلاس‌های فرزند آن باید داشته باشند و برخی رفتارهای عمومی کودک و همچنین عملکردهایی که باید داشته باشند را تعریف می‌کند. کلاس های Concrete کلاس های انتزاعی را گسترش می دهند و عملکرد اجرا نشده را ارائه می دهند، در حالی که ویژگی های مشترک را به ارث می برند.

کلاس های انتزاعی در پایتون

به عنوان مثال، همه Animalیک دارند eat() عملکرد، معمولا بین همه حیوانات اجرا می شود، اما هر کدام منحصر به فرد هستند speak() توابع به طوری انتزاعی Animal کلاس این را به عهده بچه ها می گذارد.

در پایتون، هر کلاس انتزاعی از the مشتق شده است ABC کلاس از abc مدول. متد abstract در داخل کلاس abstract اعلان می شود اما پیاده سازی نمی شود و تمام متدهای پیاده سازی شده به کلاس های بتن منتقل می شوند.

در مثال زیر توجه کنید که AbstractClass تعریف شامل یک @abstractmethod دکوراتور با تزئین یک تابع با آن، ما تعریف می کنیم که همه کلاس های فرزند باید پیاده سازی از را داشته باشند func() روش، از آنجایی که هیچ پیش‌فرض و پیاده‌سازی رایجی وجود ندارد:

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    @abstractmethod
    def func():
        pass

اجرای جزئی کلاس کارخانه انتزاعی مادر توسط فرزندان / کلاس بتن آن انجام می شود. هر کلاس کودک شامل یک func() روشی برای برآوردن الزامات کلاس انتزاعی.

با استفاده از مثال قبلی، می‌توانیم یک کلاس فرزند مانند زیر ایجاد کنیم:

from abc import ABC, abstractmethod

class AbstractClass(ABC):
    @abstractmethod
    def func(self):
        pass

class ChildClass(AbstractClass):
    def func(self):
        out = "This is an output"
        return out

obj = ChildClass()
print(obj.func())

الگوی طراحی انتزاعی کارخانه در پایتون

بازگشت به تعریف الگوی کارخانه انتزاعی:

از طریق Abstract Factory Pattern تعریف می کنیم رابط ها برای ایجاد خانواده هایی از اشیاء مرتبط بدون مشخص کردن کلاس های مشخص آنها.

بنابراین، Abstract Factory Pattern ایجاد اشیا را به کلاس دیگری واگذار می کند. این الگو زمانی مناسب تر است که فرد بخواهد چندین دسته از یک شی را با انتزاع پیاده سازی آن ایجاد کند.

شاید با این مفهوم آشنا باشید کارخانه ها – اینها اشیایی هستند که اشیاء دیگری را ایجاد می کنند. الگوی Abstract Factory در درجه اول به رابط برای اشیاء کارخانه مربوط می شود.

خانواده اشیاء چیست؟

یک میز می تواند گرد، مربع یا بیضی باشد. به معنای مشابه، یک طبقه مشترک مانند an Employee ممکن است به چندین کلاس بتنی دیگر منشعب شود.

در اینجا یک نمایش تصویری از الگوی کارخانه انتزاعی است:

نمایش تصویری الگوی کارخانه انتزاعی در پایتون

فرض کنید خانواده ای متشکل از دو محصول (مرورگر و پیام رسان) را طراحی می کنید.

  • محصولات چکیده: دو کلاس انتزاعی ایجاد می شود، یکی برای مرورگر و دیگری برای پیام رسان. این کلاس ها شامل روش های انتزاعی هستند که برای ساخت محصولات اجباری هستند. این کلاس های انتزاعی به عنوان رابط نامیده می شوند.

    در مثال بالا نشان داده شده است مرورگر اینترنت و پیام رسان محصولات انتزاعی هستند.

  • محصولات بتنی: محصولات بتنی روش های انتزاعی را از طبقات انتزاعی یعنی محصولات انتزاعی به ارث می برند. با استفاده از اینترفیس ها می توان خانواده های مختلفی از محصولات را ایجاد کرد.

    به عنوان مثال ، در نمودار فوق ، سه نوع مختلف مرورگرهای وب برای سه مجموعه مختلف از کاربران ایجاد می شود. اگر همه این محصولات بتن در یک چیز مشترک باشند، آن روش های انتزاعی است که در کلاس انتزاعی تعریف شده است.

  • کارخانه های بتن : کارخانه های بتونی مطابق با کارخانه های انتزاعی ، محصولات بتونی را ایجاد می کنند. کارخانه های بتونی فقط قادر به ایجاد محصولاتی هستند که در آنها مشخص شده اند – الف BrowserFactory مرورگر ایجاد می کند، در حالی که a MessengerFactory پیام رسان ایجاد می کند از طرف دیگر، می توانید تمرکز کنید روی برخی از ویژگی های مشترک، و می گویند – ایجاد یک BasicFactory و SecureFactory که مرورگرهای وب اساسی یا ایمن و نمونه های پیام رسان را ایجاد می کنند.

    در نمودار ذکر شده در بالا، کارخانه محصولات وانیلی قادر به ایجاد هر دو محصول بتن وانیلی (مرورگر و پیام رسان) است، در حالی که کارخانه محصولات امن نسخه های ایمن را تولید می کند.

  • کارخانه های چکیده: کارخانه های انتزاعی دارای رابط هایی برای ایجاد محصولات انتزاعی هستند.

    به عنوان مثال ، از رابط های کارخانه های بتونی استفاده می شود تا محصولات انتزاعی را به عنوان مرورگر وب و پیام رسان بدست آورند.

پیاده سازی

با اصطلاحات آشنا ، بیایید سعی کنیم الگوی انتزاعی کارخانه در پایتون را اجرا کنیم.

ابتدا، ما محصولات انتزاعی را ایجاد می کنیم – Browser و Messenger مانند:

from abc import ABC, abstractmethod

class Browser(ABC):
    """
    Creates "Abstract Product A"
    """

    
    @abstractmethod
    def create_search_toolbar(self):
        pass

    
    @abstractmethod
    def create_browser_window(self):
        pass

class Messenger(ABC):
    """
    Creates "Abstract Product B"
    """

    @abstractmethod
    
    def create_messenger_window(self):
        pass

اینها به عنوان کلاسهای پایه به کلاسهای بتونی زیر عمل می کنند یعنی انواع محصول محصولات انتزاعی – وانیل و ایمن:

class VanillaBrowser(Browser):
    """
    Type: Concrete Product
    Abstract methods of the Browser base class are implemented.
    """

    
    def create_search_toolbar(self):
        print("Search Toolbar Created")

    
    def create_browser_window(self):
        print("Browser Window Created")


class VanillaMessenger(Messenger):
    """
    Type: Concrete Product
    Abstract methods of the Messenger base class are implemented.
    """

    
    def create_messenger_window(self):
        print("Messenger Window Created")

class SecureBrowser(Browser):
    """
    Type: Concrete Product
    Abstract methods of the Browser base class are implemented.
    """

    
    def create_search_toolbar(self):
        print("Secure Browser - Search Toolbar Created")

    
    def create_browser_window(self):
        print("Secure Browser - Browser Window Created")

    def create_incognito_mode(self):
        print("Secure Browser - Incognito Mode Created")


class SecureMessenger(Messenger):
    """
    Type: Concrete Product
    Abstract methods of the Messenger base class are implemented.
    """

    
    def create_messenger_window(self):
        print("Secure Messenger - Messenger Window Created")

    def create_privacy_filter(self):
        print("Secure Messenger - Privacy Filter Created")

    def disappearing_messages(self):
        print("Secure Messenger - Disappearing Messages Feature Enabled")

می توانید متوجه شوید که جدای از روش های انتزاعی، ویژگی های اضافی نیز به محصولات بتنی اضافه شده است تا آنها را در زمینه خود کاربردی کند.

ما تقریباً آنجا هستیم. بیایید اکنون کارخانه انتزاعی و کارخانه های بتونی مربوطه را ایجاد کنیم:

class AbstractFactory(ABC):
    """
    The Abstract Factory
    """

    @abstractmethod
    def create_browser(self):
        pass

    @abstractmethod
    def create_messenger(self):
        pass

class VanillaProductsFactory(AbstractFactory):
    """
    Type: Concrete Factory
    Implement the operations to create concrete product objects.
    """

    def create_browser(self):
        return VanillaBrowser()

    def create_messenger(self):
        return VanillaMessenger()

class SecureProductsFactory(AbstractFactory):
    """
    Type: Concrete Factory
    Implement the operations to create concrete product objects.
    """

    def create_browser(self):
        return SecureBrowser()

    def create_messenger(self):
        return SecureMessenger()

در کد بالا، از آنجایی که AbstractFactory به عنوان یک کلاس پایه عمل می کند ، روشهای انتزاعی دقیقاً همانطور که در کلاس پایه ذکر شد ، فوری می شوند.

بیایید یک را اضافه کنیم main() روش بنابراین ما مثال خود را در عمل می بینیم:

def main():
    for factory in (VanillaProductsFactory(), SecureProductsFactory()):
        product_a = factory.create_browser()
        product_b = factory.create_messenger()
        product_a.create_browser_window()
        product_a.create_search_toolbar()
        product_b.create_messenger_window()

if __name__ == "__main__":
    main()

اگر می خواهید کل پرونده کد را ببینید ، می توانید آن را در repo پیدا کنید روی GitHub.

اگر کد خود را اجرا کنیم ، خروجی زیر را نشان می دهد که ایجاد مرورگر ایمن و مسنجر ایمن را نشان می دهد:

$ python3 abstract_factory_code.py
Browser Window Created
Search Toolbar Created
Messenger Window Created
Secure Browser - Browser Window Created
Secure Browser - Search Toolbar Created
Secure Messenger - Messenger Window Created

جوانب مثبت منفی

اکنون که این الگوی را اجرا کردیم ، بیایید جوانب مثبت و منفی آنها را وزن کنیم.

طرفداران:

  • مزیت اصلی این الگو انعطاف پذیری است – توانایی افزودن ویژگی ها و عملکردهای جدیدتر به محصولات موجود یا شاید حتی افزودن محصولات بتنی جدیدتر به کارخانه های بتن. این کار را می توان بدون خراب کردن کل کد انجام داد.

  • حداقل تعامل مستقیم بین مشتری و محصولات بتنی وجود دارد. همچنین انعطاف پذیری در سازماندهی و فشرده سازی کد وجود دارد.

منفی

  • اشکال عمده این الگو خوانایی و قابلیت نگهداری کد است. اگرچه روشی انعطاف‌پذیر برای افزودن آتی‌های جدید فراهم می‌کند، افزودن یک جزء جدید مستلزم افزودن به کلاس‌های بتن، اصلاح رابط‌ها و غیره است. اثرات آبشاری اصلاح زمان توسعه را می‌طلبد.

نتیجه

الگوی Abstract Factory را می توان به طور بسیار موثر برای خانواده های نزدیک محصولات مختلف استفاده کرد، برخلاف الگوی کارخانه، که فقط برای یک نوع محصول قابل استفاده است.

اگر علاقه مند به کسب اطلاعات بیشتر در مورد آن هستید، راهنمای ما در مورد الگوی کارخانه در پایتون را بخوانید.

الگوی Abstract Factory یک بحران بزرگ برای نیاز به نوشتن کد تمیز را حل می کند. ما اصول اولیه این الگو را پوشش داده ایم و با استفاده از یک مثال پیاده سازی را نیز درک کرده ایم.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-08 18:20:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید