【问题标题】:Factory method for objects with many parameters具有许多参数的对象的工厂方法
【发布时间】:2016-03-10 12:32:37
【问题描述】:

让我介绍一下我的问题。我正在创建一组通常是食物的对象,但它们中的每一个都可能具有完全不同的一组属性来设置。 我想使用工厂设计模式,然后我遇到了一个问题,在哪里以及如何设置对象属性,然后我发现了一些 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

我的问题是:我想为构造函数传递参数,但不知道如何。建造者模式在这里是不是好主意?属性列表可能更长。我还想知道是否传递一个以属性名称作为键和值作为值的上下文字典。 任何想法如何解决这个问题?非常感谢任何提示和技巧。

问候

【问题讨论】:

  • 这在我看来是过度设计的。 FoodFactory 能给你带来什么?将类存储在字典中并在字符串上分派能为您带来什么?
  • 当您创建Food 子类实例时,您显然知道您正在创建哪个实例,因为FoodFactory.create_food() 需要food_type 参数......并且大概还有它的属性是什么或应该。只需直接调用子类并传递构造它所需的参数值即可。也就是说,为了让你能够传递任意参数,你可以让 create_food() 方法接受 **kwargs 并将它们传递给从字典中提取的被调用类。
  • @BenjaminHodgson 字典用作 switch 语句,但也可以用 if 和 elifs 编写。目前我有一个大文件解析一些响应,我想让它可维护且更清洁。这就是我想制作食品工厂的原因。

标签: python oop design-patterns


【解决方案1】:

只需像这样编辑您的FoodFactory

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

现在您可以为每个食品类使用关键字参数:

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

会打印出如下内容:

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

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多