前面工厂方法模式中考虑的是一类产品的生产, 如畜牧场只管动物、电视机厂只产电视机等.
同种类称为同等级, 也就是说,工厂方法模式只会考虑生产同等级的产品,但是在现实生活中许多工厂都是综合性很强的,也会加大工厂的最大使用效率,能够生产出多等级的产品. 畜牧场可以养动物,也可以养植物等.
本篇博客将讲述抽象工厂方法模式.抽象工厂模式将考虑多等级的产品同时生产,将处于同一个具体工厂所生产的不同等级的产品作为一个产品族.
模式的定义与特点
定义
是一种为访问类创建一组相关或者相互依赖的接口,并且访问类不需要制定所要的产品的具体类就可以得到同族不同等级的产品模式结构.
抽象工厂模式一般都是工厂模式的升级, 工厂模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品.
特点
使用抽象工厂模式一般要满足如下条件.
- 系统中有许多个产品族,每个具体工厂创建统一族但又属于不同等级结构的产品.
抽象工厂有工厂模式的优点之外,还主要有以下优点:
- 可在类的内部对产品族中相关联的等级产品进行共同管理,并且不需要引入多个类来进行管理.
- 当增加一个产品族时,不需要更改原来的代码,满足了开闭原则.
抽象工厂缺点:
- 当产品族中需要增加新的产品时,所有的工厂类都需要更改
模式的结构和实现
抽象工厂和工厂方法一样,都是由抽象工厂、具体工厂、抽象产品和具体产品4个要素组成,但是抽象工厂中方法个数有所不同,抽象的产品也会有不同.
结构:
模式的主要角色如下:
- 抽象工厂: 提供了创建产品的接口,包含了多个创建产品的方法,也可以创建多个不同等级的产品.
- 具体工厂: 实现抽象工厂的多个抽象方法, 完成具体产品的创建.
- 抽象产品: 定义了产品规范, 描述产品的主要特性和功能, 抽象工厂模式有多个的抽象产品.
- 具体产品: 实现了抽象产品定义的接口, 具体工厂来创建, 同具体工厂的关系是多对一.
结构图如下:
模式的实现
上面的图可发现,抽象工厂和工厂方法有些类似,不同的是产品种类不止一个, 所以创建产品方法也不止一个.
抽象工厂: 提供了产品的生产方法
interface AbstractFactory { public Product1 newProduct1(); public Product2 newProduct2(); }
具体工厂: 实现产品的生产
class ConcreteFactory1 implements AbstractFactory { public Product1 newProduct1() { System.out.println("具体工厂 1 生成-->具体产品 11..."); return new ConcreteProduct11(); } public Product2 newProduct2() { System.out.println("具体工厂 1 生成-->具体产品 21..."); return new ConcreteProduct21(); } }
模式应用实例
[例1] 抽象工厂设计牧场类.
分析: 农场除了畜牧业可以养动物,也可以养植物,并且也可以种其他的.
抽象工厂模式设计两个牧场, 一个农场用于养牛和种菜 ,一个用于养马和种水果.
可以在两个农场定义生成动物的方法和培养植物的算法.
设计如下结构图:
代码如下:
//抽象产品:动物类 interface Animal { public void show(); } //具体产品:马类 class Horse implements Animal { public void show() { jf.setVisible(true); } } //具体产品:牛类 class Cattle implements Animal { public void show() { jf.setVisible(true); } } //抽象产品:植物类 interface Plant { public void show(); } //具体产品:水果类 class Fruitage implements Plant { public void show() { jf.setVisible(true); } } //具体产品:蔬菜类 class Vegetables implements Plant { public void show() { jf.setVisible(true); } } //抽象工厂:农场类 interface Farm { public Animal newAnimal(); public Plant newPlant(); } //具体工厂:农场类1 class SGfarm implements Farm { public Animal newAnimal() { System.out.println("新牛出生!"); return new Cattle(); } public Plant newPlant() { System.out.println("蔬菜长成!"); return new Vegetables(); } } //具体工厂:农场类2 class SRfarm implements Farm { public Animal newAnimal() { System.out.println("新马出生!"); return new Horse(); } public Plant newPlant() { System.out.println("水果长成!"); return new Fruitage(); } }
模式的应用场景
抽象工厂模式一般适用于如下场景:
- 当需要创建的对象是一系列的相互关联或者依赖的产品族时. 例如工厂中的电视机,收音机以及空调等
- 系统有多个产品族, 但每次只使用其中的某一族产品时. 如有人只希望某种品牌的衣服和鞋子
- 系统提供了产品的类库, 所有产品的接口都相同.
模式的拓展:
- 当增加了一个新的产品族时只需要增加一个新的具体实现工厂,不需要更改原来的代码,满足了开闭原则
- 当产品族需要增加一个新种类的产品时, 所有的工厂类都需要更改,不符合开闭原则
- 当只存在了一个等级结构的产品时,也就退化到了工厂模式的结构.
以上就是抽象工厂的理论和实践模式的内容,希望对大家有所帮助!!!