2016-03-10 64 views
1

讓我來介紹一下我的問題。我創建了一組通常爲Food的對象,但其中的每個對象都可能具有完全不同的一組屬性來設置。 我以爲使用工廠設計模式,然後我遇到了一個問題,在哪裏以及如何設置對象的屬性,然後我發現了一些Builder模式。但是我不確定我是否在正確的道路上。 例子:具有多個參數的對象的工廠方法

class Food(object): 
    def __init__(self, taste = None): 
     self._taste = taste 
class Bread(Food): 
    def __init__(self, flour_type = None): 
     Food.__init__(self, taste = 'good') 
     self._flour = flour_type 
class Meat(Food): 
    def __init__(self, type = None, energy_value = None, taste = None): 
     Food.__init__(self, taste = taste) 
     self._type = type 
     self._energy = energy_value 
class Soup(Food): 
    def __init__(self, name = None, recipe = None): 
     Food.__init__(self, taste = 'fine') 
     self._name = name 
     self._recipe = recipe 

,然後我有一個工廠這樣的:

FOOD_TYPES = {'food':Food, 'bread':Bread, 'meat':Meat, 'soup':Soup} 

class FoodFactory(object): 
    @staticmethod 
    def create_food(food_type): 
     try: 
      return FOOD_TYPES[food_type.lower()]() 
     except Exception: 
      return None 

我的問題是:我想傳遞的構造函數的參數,但不知道怎麼辦。在這裏建設者模式的好主意嗎?屬性列表可能會更長。我還想知道是否將具有屬性名稱的上下文字典作爲鍵和值傳遞給值。 任何想法如何解決這個問題?真的很感謝任何提示和技巧。

問候

+1

這看起來像是被我過度工程化了。 「FoodFactory」能爲你帶來什麼?將這些類存儲在字典中並在字符串上進行分派會爲您帶來怎樣的收益? –

+1

當你創建一個'Food'子類實例時,你顯然知道你正在創建哪一個,因爲'FoodFactory.create_food()'需要的'food_type'參數......並且大概也是它的屬性是或應該是什麼。只需直接調用子類並傳遞構造它所需的參數值即可。也就是說,爲了使你能夠傳遞任意參數,你可以讓'create_food()'方法接受'** kwargs'並將它們傳遞給從字典中拉出的被調用類。 – martineau

+0

@BenjaminHodgson該字典作爲switch語句工作,但也可以使用if和elifs編寫。目前,我已經得到了一個大文件解析一些迴應,我想讓它可維護,更清潔。這就是爲什麼我想製作食品工廠。 – jano

回答

1

只要編輯您的FoodFactory這樣的:

class FoodFactory(object): 
    @staticmethod 
    def create_food(food_type, **kwargs): 
     try: 
      return FOOD_TYPES[food_type.lower()](**kwargs) 
     except Exception: 
      return None 

現在你可以使用keyworded參數每個食品類:

>>> meat = FoodFactory.create_food("meat", energy_value=25) 
>>> print meat 
>>> print meat._energy 

會打印出像:

>>> <__main__.Meat object at 0x03122AB0> 
>>> 25 

希望這有助於!

相關問題