设计模式——工厂模式

简单工厂、工厂方法、抽象工厂

工厂模式

工厂方法和抽象工厂在GOF中都在创建型模式章节中,但是看了两遍都不明白两者的区别,直到我看到了这篇文章——结合实例分析简单工厂模式&工厂方法模式&抽象工厂模式的区别。这篇文章逐层递进,一一举例说明了简单工厂、工厂方法、抽象工厂三种模式,这里根据例子,再读工厂方法和抽象工厂,加深理解。

简单工厂

设计模式——工厂模式
简单工厂模式中,工厂根据输入条件,生产不同的产品,但是客户需要知道条件,通俗点理解就是一个希望使用工厂的程序员,需要知道代码细节,才能创建正确的产品。此时将生产不同产品的工厂,抽象出一个共同的接口,即可理解为工厂方法。

工厂方法

设计模式——工厂模式
(这里就直接截图GOF书中的类图结构了)
工厂方法中,对于不同的ConcreteProduct,需要有不同的ConcreteCreator类,即对于Product的子类,需要对应的Creator子类。
到这里,就有个问题了,对于每个Product子类都要有Creator子类,那不是太多工厂了,解决方式有多种:

  1. 参数化工厂,也就是回退到简单工厂模式;
  2. 采用原型模式,不创建Creator的子类;
  3. 合并产品族,即抽象工厂模式,这里的族,不是产品类别的概念,而是同种风格、同属一个厂家的产品。

抽象工厂

设计模式——工厂模式
图中Motif和PM是两种不同的风格,两种不同风格之中都要有ScrollBar、Window,那么就可以将风格相同的ScrollBar、Window工厂放在一起,并抽象出大家都有的工厂方法集合,也就是抽象工厂了。
GOF书中对于产品族的理解,一定要看这个图,抽象工厂,是对产品族的抽象,每个实际工厂是一个厂家、风格。
设计模式——工厂模式
这样再来看抽象工厂模式,就不是那么难以理解了。

总结

在对工厂模式的学习上,有两点对学习方法上的体会:

  1. 晦涩的概念,一定要有例子,学习开始阶段一定是特殊到一般的;
  2. 学习应该是逐层递进的,如果开始读GOF书时,能够体会到简单工厂只是特化的工厂方法,而工厂方法与抽象工厂有紧密联系,那对着三种模式的理解,也就不至于这么困难了。