- 工厂模式
1> 定义:
定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
2> 主要优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
3> 缺点:
每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
4> 结构:
工厂方法模式由抽象工厂、具体工厂、抽象产品和具体产品等4个要素构成。(1)工厂模式的结构
工厂方法模式的主要角色如下:
(1)抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法newProduct() 来创建产品。
(2)具体工厂(ConcreteFactory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
(3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能。
(4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
其结构图如图 1 所示。
图1 工厂模式结构图
- 抽象工厂模式
1> 定义:
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
2> 结构:
抽象工厂模式的主要角色如下。
(1)抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
(2)具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
(3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
(4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对一的关系。
抽象工厂模式的结构图如图2所示。
图2 抽象工厂模式结构图
四、实验步骤
1、Factory模式
Factory模式的作用:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。
该实例的UML 结构图如图3所示。
图3 工厂模式实例-汽车工厂的UML图
该UML图对应工厂模式的结构如下:
抽象工厂:CarFactory:提供了创建产品的接口(或抽象类)。
具体工厂:ACarFactory和BFactory:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
抽象产品:Car:定义了产品的规范,描述了产品的主要特性和功能。
具体产品:ACar和BCar:实现了抽象产品角色所定义的接口(或抽象类)。
在这个模式中,有两个抽象类,一个是Car,它是产品的抽象基类,一个是CarFactory是工厂的抽象基类,在互相协作的时候都是由相应的CarFactory派生类来生成Car的派生类,也就是说如果要新增一种Car那么也要对应的新增一个对应的CarFactory,创建的过程委托给了这个CarFactory,也就是说一个CarFactory和一个Car是一一对应的关系。
2、Abstract Factory模式
Abstract Factory模式的作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
该实例的UML结构图如图4所示:
图4 抽象工厂模式实例-汽车手机工厂的UML图
抽象类:
(1) 抽象产品:Car,Phone:分别代表不同类型的产品,定义了产品的规范,描述了产品的主要特性和功能。
(2) 抽象工厂:EFFactory:生产这一系列产品的一个抽象工厂,提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。
(3)具体产品:APhone,ACar,BPhone,BCar:实现了抽象产品角色所定义的接口(或抽象类)。
(4)具体工厂:AFactory、BFactory:主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
其中抽象方法:EFFactory.produceCar,EFFactory.producePhone:分别是生产不同产品的不同的实现,由各个派生出来的抽象工厂实现之。
Abstract Factory 模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象,其中创建的实现其实采用的就是Factory模式的方法,对于某个实现有一个派生出来的抽象工厂,另一个实现有另一个派生出来的工厂等等。
抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现。显而易见的,如果有n种产品同时有m中不同的实现,那么根据乘法原理可知有n*m个Factory模式的使用。
总结:
1、如果没有应对“多系列对象构建”的需求变化,则没有必要使用Abstract Factory模式,这是要使用工厂方法即可。“系列对象”指的是某一特定系列下的对象之间有相互依赖或作用的关系。不同系列的对象之间不能相互依赖。Abstract Factory模式主要在于应对“新系列”的需求变动。其缺点在于难以应对“新对象”的需求变动。
2、工厂模式的适用场景:
一个系统应当不依赖于产品类实例被创立,组成,和表示的细节。这对于所有形态的工厂模式都是重要的。这个系统的产品有至少一个的产品族。同属于同一产品族的产品是设计成在一起使用的,这一约束必须得在系统的设计中体现出来。不同的产品以一系列的接口的面貌出现,从而使系统不依赖与接口实现的细节。
3、工厂模式与抽象工厂模式的对比:
(1)工厂模式是一种极端情况下的抽象工厂模式,而抽象工厂模式可以看成是工厂模式的推广。
(2)工厂模式用来创建一个产品的等级结构,而抽象工厂模式是用来创建多个产品的等级结构。
(3)工厂模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。