سلام
با توجه به نمونه کدی که استاد پیاده سازی کرد
سوالم اینجاست که مثلا اگر فروشگاه من ۱۰۰۰ تا محصول متفاوت داشته باشد
آیا برای ۱۰۰۰ محصول باید کلاس 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 که انتخاب کردیم، این پیچیدگی وارد کدی که نوشتیم نمیشه و در آینده توسعه رو سادهتر میکنه.
این نکته رو هم اضافه کنم که تعداد آبجکتهای ساخته شده ملاک بهینه بودن یا نبودن نیست، مراقب باشین که اشتباه نشه.