三种工厂模式的区别

本文主要记录简单工厂模式、工厂模式、抽象工厂模式三者的区别

三者的共同点是:

1、都有两种作用不同的类:产品类和工厂类。其中,工厂类在自己的方法中实例化产品类(即使用new命令生成产品类的对象),并将生成的产品类的对象提供给外部使用。

2、创建的过程,都是类似的:工厂类得到一个标志(可以由程序输入,也可以读取配置文件中的内容),返回一个产品对象。

三种模式的区别:

简单工厂:用来生产同一等级结构中的任意产品,比如香蕉、苹果、梨就是同一等级结构中的三种商品。简单工厂通过一个含参的工厂方法,我们可以实例化任何产品类。
从开闭原则的角度来看,简单工厂模式不符合开闭原则,每次增加新的产品,都需要修改简单工厂类来适应新的产品。
优点:简答工厂的有点是实现简单,
缺点:(1)在遵循开闭原则的前提下,扩展产品很困难。(2)任何产品都通过简单工厂来实现,产品很多的情况下,简单工厂代码太重。

特别说明:但是在一些语言中(如PHP),类名可以使用变量,所以简单工厂的两个缺点几乎不存在了。

工厂模式:用来生成同一等级结构中的固定产品。工厂模式相当于将产品生产的操作提前,不由工厂来进行,工厂和产品呈现1对1的关系,所以,选择生产产品的变成了客户端,而不是工厂,客户端选择了工厂,意味着就选择了产品。增加新的产品,需要增加对应的工厂。
优点:(1)允许系统在不修改工厂角色的情况下引进新产品。(2)符合开闭原则,工厂和产品一旦建立,不会在进行代码的修改。如果有新的产品,属于扩展行为。
缺点:(1)每个新的产品对象的创建都需要创建专门的工厂类,实现复杂。

抽象工厂:用来生成不同产品族的全部产品,如果每个产品族只有一个产品,其实抽象工厂就类似工厂模式了。抽象工厂模式里边生成一系列产品利用的是类的组合。每个从工厂里都可以实例化一系列的产品,实现一个产品族的生产。