💻 آخرین فرصت یادگیری برنامه‌نویسی با آفر ویژه قبل از افزایش قیمت در ۵ آذر ماه (🎁 به همراه یک هدیه ارزشمند )
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ Ahmad As
اضافه کردن محصول با استفاده از Abstract Factory
حسین رمضان پور حل شده توسط حسین رمضان پور

سلام
با توجه به نمونه کدی که استاد پیاده سازی کرد

سوالم اینجاست که مثلا اگر فروشگاه من ۱۰۰۰ تا محصول متفاوت داشته باشد

آیا برای ۱۰۰۰ محصول باید کلاس detail , و هم price , و هم productBase تعریف کنیم ؟
خیلی شلوغ نمیشه؟

from abc import ABC, abstractmethod
class DetailBase(ABC):
    @abstractmethod
    def show(self):
        pass
class RugsDetail(DetailBase):
    def __init__(self, rugs):
        self.rugs = rugs
    def show(self):
        return f"rugs detail: {self.rugs._name}"
class RugsPrice(DetailBase):
    def __init__(self, rugs):
        self.rugs = rugs
    def show(self):
        return f"rugs price: {self.rugs._price}$"
class GiftCardDetail(DetailBase):
    def __init__(self, card):
        self.card = card
    def show(self):
        return f"company: {self.card.company}"
class GiftCardPrice(DetailBase):
    def __init__(self, card):
        self.card = card
    def show(self):
        return f"gift card min price: {self.card.min_price}\tmax price: {self.card.max_price}\t"
class ProductBase(ABC):
    @abstractmethod
    def detail(self):
        pass
    @abstractmethod
    def price(self):
        pass
    # @abstractmethod
    # def shipping(self):
    #     pass
class Rugs(ProductBase):
    def __init__(self, name, price):
        self._name = name
        self._price = price
    @property
    def detail(self):
        return RugsDetail(self)
    @property
    def price(self):
        return RugsPrice(self)
class GiftCard(ProductBase):
    def __init__(self, company, min_price, max_price):
        self.company = company
        self.min_price = min_price
        self.max_price = max_price
    @property
    def detail(self):
        return GiftCardDetail(self)
    @property
    def price(self):
        return GiftCardPrice(self)
if __name__ == "__main__":
    r1 = Rugs('persian rugs', 135)
    r2 = Rugs('nain rugs', 150)
    g1 = GiftCard('google', 20, 60)
    g2 = GiftCard('apple', 20, 60)
    products = [r1, r2, g1, g2]
    for product in products:
        print(product.detail.show())
        print(product.price.show())

 

سلام

هدف ما توی حل کردن این مثال دقیقا پنهان کردن این پیچیدگی، موقع ساخت محصول بوده.
یعنی همونطور که شما گفتین برای ساختن هر محصول ما (حداقل) ۳ آبجکت از ۳ کلاس مختلف میسازیم اما با توجه به الگوی Abstract Factory که انتخاب کردیم، این پیچیدگی وارد کدی که نوشتیم نمیشه و در آینده توسعه رو ساده‌تر می‌کنه.

این نکته رو هم اضافه کنم که تعداد آبجکت‌های ساخته شده ملاک بهینه بودن یا نبودن نیست، مراقب باشین که اشتباه نشه.

بهترین پاسخ
حسین رمضان پور ۳۰ آبان ۱۳۹۹، ۱۰:۳۱