设计模式系列(七)简单工厂模式、工厂方法模式和抽象工厂模式对比
在前面的三篇文章中,依次讲解了简单工厂模式、工厂方法模式和抽象工厂模式,这篇文章主要对其进行简单的对比和概括,详细部分大家可以参考前三篇文章。
简单工厂模式:点击打开链接
工厂方法模式:点击打开链接
抽象工厂模式:点击打开链接
下面我们来总体看一下这三个模式的例子的UML类图。
图1 简单工厂模式例子的UML类图
图2 工厂方法模式例子的UML类图
图3 抽象工厂模式的UML类图
从上面的三个UML类图可以看出,这三个例子其实本质上是一样的,只不过是由浅入深,逐步深入扩展而已。这三个例子都是关于开披萨店的例子。
(1)简单工厂模式仅仅用一个工厂类来决定到底创建哪种披萨,从而封装了变化的部分,对用户不变。
(2)工厂方法模式通过在抽象工厂类中定义了一个抽象方法,然后让子类去实现这个方法,从而将具体对象的创建延迟到了子类,让子类决定到底创建什么样的披萨,这个显得更有弹性,也封装了变化,对用户而言是不变的。但是注意,这里创建的只是一种对象,即披萨。
(3)抽象工厂模式最为复杂,它扩充自工厂方法模式的例子,只是在其中修改了一些实现形式,然后加上了原料工厂,这个工厂里面生产所有的原料,所以构成了一个产品族,而其中每个产品的创建其实还是使用类似于工厂方法的形式创建,所以可以说抽象工厂模式中运用了工厂方法模式。
对于工厂方法模式和抽象工厂模式的区别可以简单对比如下:
(1)抽象工厂模式创建的是一族产品,而工厂方法创建的是一个产品,抽象工厂模式里面其实使用了工厂方法模式,对于每一个产品的创建,其实和工厂方法模式十分类似;
(2)抽象工厂模式采用的是对象组合,将各种产品组合在一个工厂里面,然后由具体类实现,对象的创建被实现在工厂接口所暴露出来的方法中,而工厂方法模式则使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象;
(3)当需要创建产品家族和想制造相关产品的集合时,可以使用抽象工厂模式,而工厂方法可以把客户代码实例化的具体类中解耦,其使用方式很简单,只需要继承成子类,并实现工厂方法即可;
(4)抽象工厂模式更为复杂,工厂方法模式相对于比较简单。
(2)抽象工厂模式采用的是对象组合,将各种产品组合在一个工厂里面,然后由具体类实现,对象的创建被实现在工厂接口所暴露出来的方法中,而工厂方法模式则使用继承,把对象的创建委托给子类,子类实现工厂方法来创建对象;
(3)当需要创建产品家族和想制造相关产品的集合时,可以使用抽象工厂模式,而工厂方法可以把客户代码实例化的具体类中解耦,其使用方式很简单,只需要继承成子类,并实现工厂方法即可;
(4)抽象工厂模式更为复杂,工厂方法模式相对于比较简单。
总之,总体来看,抽象工厂模式是最复杂的,可以说处于高层;工厂方法模式较为复杂,可以说处于中层;简单工厂模式最为简单,可以说处于低层。大家要清楚,简单工厂模式其实本质上不算是一种设计模式,它也不属于23种设计模式之一,它主要用于创建的对象较少,较为简单的时候。最为重要的还是工厂方法模式和抽象工厂模式。