【发布时间】:2015-09-18 04:30:03
【问题描述】:
我正在尝试在 Python 中使用一个抽象工厂,使用以下 3 个文件进行最低限度的复制:
test_factory.py
from factory import Factory
def test_factory():
factory = Factory.makeFactory()
product = factory.makeProduct('Hi there')
print(product)
if __name__ == '__main__':
test_factory()
factory.py
from abc import ABCMeta, abstractmethod
from product import ConcreteProduct
class Factory(metaclass=ABCMeta):
@classmethod
@abstractmethod
def makeProduct(cls):
pass
@classmethod
def makeFactory(cls):
return ConcreteFactory()
class ConcreteFactory(Factory):
@classmethod
def makeProduct(cls, message):
return ConcreteProduct(message)
product.py
class ConcreteProduct(object):
def __init__(self, message):
self._message = message
def __str__(self):
return self._message
我无法弄清楚如何模拟此代码以验证 ConcreteProduct.__init__ 是否使用适当的值调用。由于测试文件永远不会看到product.py,因此我不确定如何完成此操作,或者是否可能。我怀疑我的设计存在更根本的问题。
【问题讨论】:
-
Factory.makeFactory应该返回cls(),而不是ConcreteFactory(),以避免对特定子类的任何依赖。 -
@chepner 在这种情况下它将返回一个
Factory实例,其中包含我拥有的代码。有没有更好的方法来构建它? -
cls绑定到调用该方法的任何类,而不是定义该方法的类。 -
对,我直接从
Factory调用它,所以cls将是Factory。 -
如果
ConcreteFactory是Factory的唯一子级,那么单独的基类和子类没有多大意义;如果除了ConcreteFactory之外还有另一个孩子,那么Factory.makeFactory为什么要返回一个实例呢?通常,工厂函数将使用参数调用以指定使用哪个类来创建实例;一种方法是直接从要实例化的类中调用makeFactory。
标签: python python-3.x factory abstract-factory