از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
الگوی طراحی انتزاعی کارخانه در پایتون
سرفصلهای مطلب
معرفی
الگوهای طراحی به درک، مقیاس پذیر و قابل استفاده مجدد کد کمک می کند. بسته به الگوهای طراحی، دسته بندی های مختلفی وجود دارد روی مشکلات در حال رسیدگی وقتی کد مدولار می شود، اضافه کردن ویژگی های جدیدتر بدون ایجاد تغییرات شدید در پروژه آسان تر است.
را الگوی طراحی کارخانه انتزاعی یک الگوی ایجادی است که چارچوبی برای ایجاد رابط های اشیاء نزدیک به هم بدون مشخص کردن کلاس های آنها فراهم می کند – از این رو اصطلاح “خلاصه”.
یک کلاس انتزاعی تا حدی پیادهسازی میشود و الزاماتی را که کلاسهای فرزند آن باید داشته باشند و برخی رفتارهای عمومی کودک و همچنین عملکردهایی که باید داشته باشند را تعریف میکند. کلاس های 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
مرورگر ایجاد می کند، در حالی که aMessengerFactory
پیام رسان ایجاد می کند از طرف دیگر، می توانید تمرکز کنید روی برخی از ویژگی های مشترک، و می گویند – ایجاد یک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