一言以蔽之,工厂方法创建一个对象,抽象工厂创建一系列相关的对象。抽象工厂的实现基于工厂方法。
拿一个汽车工厂举例吧:
汽车是一种产品,我们要生产出汽车,可以使用工厂方法模式。但这里有一个问题,汽车不是凭空捏出来的,而是用轮胎、发动机、外壳等各种零件组装起来的,汽车和零件的关系如下:
n 组装 1
零件 ——————————> 汽车
如图,汽车和零件的关系是1:n,有人说,既然用工厂方法可以生产出汽车,当然也可以用工厂方法生产出零件。
诚然,技术上,用 1+n 个工厂方法生产出所有的汽车和零件是当然是可以的。但现实中,分工越来越细,依靠一个工厂生产出所有的产品是不可能的,那只会大大削弱工厂的核心竞争力。代码世界也是如此,如果通过一个方法创建出所有的零件并组装成汽车,那么这样的代码的可维护性、扩展性、重用性都将受到限制。
那么,汽车工厂的核心竞争力是什么?当然就是汽车!因为他不是轮胎工厂或者其他什么工厂,所以,汽车工厂就要专注于汽车的生产!那零部件怎么办呢?丢给另一个工厂吧——抽象工厂,让他去组织生产出所有的和汽车相关的零部件。然后,不同的抽象工厂(子类)就会按照需求组织一帮零部件工厂再使用工厂方法生产出零部件。
所以,工厂方法专注于最终产品的生产,只创建一个对象;而抽象工厂则专注于一系列相关对象的创建。
以上是一些浅解,不妥之处欢迎大家指摘评论