工厂模式和抽象工厂模式的区别

工厂模式是一种常见设计模式,大多数资料会将其分为三种:简单工厂模式(Simple Factory),工厂模式(Factory Method)和抽象工厂模式(Abstract Factory)。按照《HeadFirst Design Pattern》的说法,Simple Factory其实不能称之为一种设计模式,因为它主要思想是把对象创建的功能隔离开来,也是工厂模式思想的基础。本文主要讨论工厂模式和抽象工厂模式的对比及不同应用场景,假设读者对两种模式已有基本了解。

基本理解

  1. Factory method是一类方法的代称,用于创建对象。而Abstract Factory是使用一个Factory对象再创建一系列相关联的对象。
  2. Abstract Factory是一系列Factory method的容器,即Abstract Factory由一组Factory method构成。
  3. 一个Factory method用于创建一类对象,而Abstract Factory由一组Factory method构成,用于创建一组相关的对象。

不同应用场景

上面的三点看起来非常绕,可以通过比较两个最简单的实例来看这个问题。为了避免引入额外的逻辑,这里使用最简单的工厂和产品来解释,不加入任何现实世界的类比:

左边是工厂方法模式,Factory1和Factory2是两个Factory的实现,实现CreateProduct()。Product1和Product2是Product的实现,实现GetName()。Factory1和Factory2分别对应了Product1和Product2两个产品,即Factory1只能创建Product1,Factory2只能创建Product2。

右边是抽象工厂模式,基本都是由工厂模式直接引出而不解释为何需要它。如果先不看B(将B1,B2和Factory中的CreateB()都隐去),那么看起来抽象工厂模式与工厂模式是很类似的。为使类图看起来尽量简单,可对工厂模式中的类名和方法名做如下改名:Product -> A, GetName() -> GetNameA(), CreateProduct() -> CreateA()。

如果认为工厂模式只支持一维的“横向扩展”,如加入一个Product3,那么抽象工厂模式则支持二维扩展,除了可以“横向扩展”增加新产品A3外,还支持“纵向扩展”,增加一个新系列B。

因此,如果仅需要创建横向扩展的一种产品,工厂模式就够了;如果需要创建不同系列的多种产品,那么抽象工厂模式是正确的选择。

模式的扩展

工厂模式

工厂模式的扩展主要是增加新产品,实现起来比较容易,不需要改变接口,只需要新增一个Factory和对应的Product即可,如上图所示:增加Factory3,实现CreateProduct();增加Product3,实现GetName()。

抽象工厂模式

抽象工厂模式的扩展也是被诟病的一点,增加一个新产品后,需要修改Factory的接口,同时所有的派生Factory类也需要增加对应的实现CreateC()。此外,还需实现该产品在已有Factory中的不同实现C1和C2,改动如上图所示。