(本文中一些例子和定义均摘自《Head First 设计模式》)
* 感谢 jzkangta 老师的精彩讲解
简单工厂(Simple Factory)模式是类的创建模式,又叫做静态工厂方法(Static Factory Method)模式。
简单工厂模式的主要作用就是由一个工厂对象决定创建出那一种产品类的实例。
是否使用静态方法是需要在一开始就考虑好的,因为使用了静态方法来定义一个简单的工厂的话,就不能通过继承来改变创建方法的行为了。
我们来简单的看一个描述汽车启动,停止的例子:




















































































































工厂方法模式(Factory Method Pattern)定义了一个创建对象的接口,但由子类来决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。通过让子类决定该创建的对象是什么,来达到将对象创建过程封装的目的。所有的工厂模式都用来封装对象的创建。
与简单工厂模式之间的区别:
简单工厂模式是建立一个工厂对象来决定创建对象的类型。工厂模式是将各种产品的创建封装在各个不同的创建者(也可以说是生产者)中。简单工厂把全部的事情都在一个地方处理完了,然后工厂方法却是创建了一个框架,让子类决定要如何实现。也可以说是简单工厂方法只允许一个工厂造产品,工厂方法允许不同的工厂都造产品.在工厂方法中产品类与创建者类是平行的,因为它们都是抽象的,都有自己的许多具体的子类,每个子类都有自己的特定实现。单单工厂不具备工厂方法的弹性,如果有新的产品出现,我们将不得不修改创建方法,它不能变更正在创建的产品。
pizza store例子:
我们有许多不同地方的加盟店,也有许多不同口味的pizza
当开一个pizza店的时候,第一件事情,当然是需要有pizza


































































抽象化好了pizza后,我们接下来应当考虑的是不同口味的pizza了























有了产品后,我们应当考虑开店了。再次将考虑的目标放回到pizza store上
















































接下来该选择在何处开店,开始加盟吧































一切就绪,我们也要开始营业了















这里我们可以看到,无论是增加新的口味 还是 选择另外的地点开新的加盟店都是很方便的。
抽象工厂:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
设想一下新的情况,如果每个地方的原料采购是不同的。
1. 创建原料工厂,负责创建所有原料








2. 不同的加盟店要实现原料工厂中创建方法


















3. 修改Pizza抽象类























































4. 增加Pizza 的子类,我们发现和以前的 NYStyleChessPizza比较,唯一的差别就是相同品种的Pizza的原料不同,其他的都一样。所以去除掉以前的 NYStyleChessPizza 类,换用新的品种类。
























5.最后在回到Pizza Store中




































6. 我们来定一个pizza看看















工厂模式与抽象工厂模式的区别:
1.抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等
级结构;而抽象工厂模式则需要面对多个产品等级结构。
2.抽象工厂一般用于创建一个产品家族,缺点就是当增加新类型的时候就要改变接口了。
3.工厂模式是面向产品的,也就是说有多少种产品,就会创造出多少个平行的工厂
抽象工厂模式是面向产品结构的,当所有的产品都有相同的机构的时候,有多少种结构就有多少种工厂,对应的工厂生产对应的产品.而这所有的工厂又同是在同一个工厂等级结构中.