具有许多参数的对象的工厂方法

时间:2016-03-10 12:32:38

标签: python oop design-patterns

让我来介绍一下我的问题。我正在创建一组通常为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 个答案:

答案 0 :(得分:2)

只需像这样编辑FoodFactory

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

现在您可以为每个Food类使用keyworded参数:

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

将打印出类似的内容:

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

希望这有帮助!