抽象工厂模式属于创建型设计模式,一般用来创建复杂的对象,这种对象由许多小对象组成,这些小对象都属于某个特定的类别。
从一个例子谈起
常见的例子是在家具商城中,有家具产品:椅子和沙发等等;这些产品同时有中式、日式等风格。如果用户期望一批日式风格的家具,你就得给它一批日式风格的家具。这里中式风格的家具生产厂
就是一个复杂对象,而具体的中式椅子
就是小对象。
假设现在客户端代码希望通过调用代码,生产出一批家具,这批家具必须风格一致。没有使用这种设计模式前,我们可能会这样实现代码。
class ChinaSofa:
@classmethod
def create_sofa(cls):
return ChinaSofa()
def __str__(self):
return "china style sofa"
class ChinaChair:
@classmethod
def create_chair(cls):
return ChinaChair()
def __str__(self):
return "china style chair"
class JapanSofa:
@classmethod
def create_sofa(cls):
return JapanSofa()
def __str__(self):
return "japan style sofa"
class JapanChair:
@classmethod
def create_chair(cls):
return JapanChair()
def __str__(self):
return "japan style chair"
def main():
print(ChinaSofa.create_sofa())
print(ChinaChair.create_chair())
main()
这里 main
函数可以理解为客户端代码,我们看到在生产某种风格的产品时,代码需要知道用 ChinaSofa
类和 ChinaChair
print(ChinaSofa.create_sofa())
print(ChinaChair.create_chair())
这里有两个明显的缺点:
- 如果在产品非常多的情况下,使用者可能会在代码中混入其他风格的类来生成产品。这意味着需要使用者很大的心智负担
- 如果现在增加一种欧式风格的沙发和椅子,我们就需要修改
main
函数的代码,即代码间存在耦合
作为客户端代码的开发者会更希望自己不需要关注生产中式风格的椅子用哪个类、日式风格的椅子又是哪个类。对他来说理想的行为应该是: