01

介绍

工厂模式是一种创建型设计模式,包含三种类型,分别是简单工厂、工厂方法和抽象工厂。

《设计模式》[1]一书中,因为 GoF[2] 认为简单工厂是工厂方法的一种特例,所以 GoF 把工厂模式分为两种类型,分别是工厂方法和抽象工厂。

本文我们使用第一种分类方式,分别介绍一下工厂模式的三种类型。

02

使用场景

在介绍工厂模式的使用场景之前,我们需要先简单了解工厂模式的组成结构,一般分为抽象产品、具体产品、抽象工厂和具体工厂。

注意:简单工厂模式,不区分抽象工厂和具体工厂。

简单工厂

if

工厂方法

if

而且还可以将每个具体产品的创建逻辑拆分到不同的工厂中,避免使用一个工厂导致的代码过于复杂。

注意:拆分多个工厂,则需要维护多个工厂的代码。

抽象工厂

抽象工厂适用于一个具体工厂需要负责生产多个不同产品,并且工厂的职责不会继续增加的场景(即抽象工厂定义的一组方法不会继续增加)。

否则,不仅所有具体工厂都需要修改,抽象产品和具体产品也需要修改,违反开闭原则。

03

实现方式

简单工厂

简单工厂模式违反了开闭原则,严格意义上不算是一个设计模式,它主要包括三个结构,分别是工厂、抽象产品和具体产品。

  • 工厂 - 负责调用具体产品生产产品,返回值是抽象产品(接口)。
  • 抽象产品 - 负责定义产品,接口类型,包含一组方法。
  • 具体产品 - 负责被工厂调用,实现抽象产品(接口)。

工厂方法

工厂方法模式符合开闭原则,它相比简单工厂模式,多了一个抽象工厂的结构,总共包括四个结构,分别是抽象工厂、具体工厂、抽象产品和具体产品。

  • 抽象工厂(单个) - 负责定义工厂,接口类型,包含一组方法。
  • 具体工厂(多个) - 负责通过实例化具体产品创建产品,实现抽象工厂(接口)。
  • 抽象产品(单个) - 负责定义产品,接口类型,包含一组方法。
  • 具体产品(多个) - 负责被具体工厂调用,实现抽象产品(接口)。

注意:此处“抽象工厂”是工厂方法模式中的一个结构,不要与抽象工厂模式混淆。

抽象工厂

抽象工厂模式也是总共包括四个结构,它与工厂方法模式不同,工厂方法模式中抽象产品只有一个,而抽象工厂模式抽象产品有多个。

但是,四个结构的职责与工厂方法模式相同。

  • 抽象工厂(单个)
  • 具体工厂(多个)
  • 抽象产品(多个)
  • 具体产品(多个)

04

Go 实现

简单工厂

阅读上面这段代码,我们可以发现,我们通过代码定义简单工厂模式的三个结构。

IDrink
CocaColaSpriteIDrink
SimpleFactoryIDrinkProduce

工厂方法

阅读上面这段代码,我们通过代码定义工厂方法模式的四个结构。

IDrink
CocaColaSpriteIDrink
IFactory
CocaColaFactorySpriteFactoryIFactory

抽象工厂

阅读上面这段代码,我们通过代码定义抽象工厂模式的四个结构。

AbstractColaAbstractSprite
CocaBrandColaAbstractColaCocaBrandSpriteAbstractSprite
AbstractFactory
CocaFactoryAbstractFactoryPepsiFactoryAbstractFactory

05

总结

本文介绍的三种工厂模式中,简单工厂和工厂方法比较常用,抽象工厂使用较少。

其中,简单工厂适用于具体产品较少,且不会频繁添加具体产品的场景;

工厂方法适用于具体产品较多,且需要频繁添加具体产品的场景;

还有就是生产具体产品,代码比较复杂,不只是实例化具体产品,还需要其他业务逻辑的场景;

if

参考资料

[1]

《设计模式》: https://en.wikipedia.org/wiki/Design_Patterns

[2]

GoF: http://wiki.c2.com/?GangOfFour