0.前言
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~
无论是工厂方法模式,还是抽象工厂模式,都属于工厂模式,在形式和特点上很相近,他们的最终目的都是为了解耦。
为了方便理解,看此篇之前请先理解工厂方法模式,可以阅读我之前写过的设计模式——工厂方法模式详解。
了解完工厂方法模式我们会发现:
(1)多个具体产品类都衍生自同一个接口或抽象类。
(2)一个抽象工厂类,可以派生出多个具体工厂类。
(3)并且每个具体工厂类只能创建一个具体产品类的实例。
而抽象工厂模式是上述模式的升级版:
(1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。(看了后面的例子自然会懂~)
(2)一个抽象工厂类,可以派生出多个具体工厂类。(同工厂方法模式)
(3)并且每个具体工厂类可以创建多个具体产品类的实例。(看了后面的例子自然会懂~)
1.抽象工厂模式模式介绍
抽象工厂模式定义:
为创建一组相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。
这个定义很抽象,不急,可以看完实例再返回来看一遍。
抽象工厂模式包括的角色:
(1)抽象产品类:为各种产品声明抽象接口或抽象类。
(2)具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。
(3)抽象工厂类:声明了一组(注意是一组,看了下面的例子就会明白和工厂方法模式的区别)用于创建一种产品(每一个方法对应一种产品)的方法。
(4)具体工厂类:继承抽象工厂类,生成一组具体产品(注意是一组,这很重要)。
2. 抽象工厂模式的实现
下面是利用工厂方法模式“生产两款车子”的实例介绍,便于理解该模式如何运用。
在本例中,有两款车内空调品牌,分别为海尔和格力。也有两种发动机品牌,分别为国产和进口。
(这就是一开始所说的,抽象工厂模式有多个产品抽象类,分别为空调抽象类和发动机抽象类)
然后在本例中,对于A类车,搭载的是海尔空调和进口发动机。对于B类车,搭载的是格力空调和国产发动机。
2.1 产品抽象接口和实现
下面是空调类。
public interface Air_conditioner { void work(); } //具体产品Air_conditioner_Haier,Air_conditioner_Gree public class Air_conditioner_Haier implements Air_conditioner { @override public void work() { System.out.println(" Air_conditioner_Haier is working ..."); } } public class Air_conditioner_Gree implements Air_conditioner { @override public void work() { System.out.println(" Air_conditioner_Gree is working ..."); } }
下面是发动机类。
public interface Engine { void work(); } //具体产品Engine_Import,Engine_Domestic public class Engine_Import implements Engine { @override public void work() { System.out.println(" Engine_Import is working..."); } } public class Engine_Domestic implements Engine { @override public void work() { System.out.println(" Engine_Domestic is working. ..."); } }
2.2 抽象工厂接口与实现
public interface Abstract_CarFactory { public install_air_conditioner(); public install_engine(); } //具体工厂A类 public class CarA implements AbstractFactory { public install_air_conditioner () { return new Air_conditioner_Haier(); } public install_engine () { return new Engine_Import(); } } //具体工厂B类 public class CarB implements AbstractFactory { public install_air_conditioner () { return new Air_conditioner_Gree(); } public install_engine () { return new Engine_Domestic(); } }
2.3 使用时
Abstract_CarFactory factoryA = new CarA(); factoryA. install_air_conditioner.work(); factoryA. install_engine().work(); Abstract_CarFactory factoryB = new CarB(); factoryB. install_air_conditioner.work(); factoryB. install_engine().work();
3. 抽象工厂模式的优缺点
抽象工厂模式的优点:
(1)具有工厂方法模式解耦的优点。
(2)工厂模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构的。
最主要的是可以在类内部对产品族的关联关系进行定义和描述。
【重要拓展概念】
产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。
举例说明,EngineA和EngineB即为两个不同的等级结构,他们都衍生于Engine类。但是这里有海尔、格力两种空调,并且这两种空调都搭载到两种车子内(从这两个维度看,是有四种类型的车子了)。
那么搭载海尔空调的AB两款车子就属于同一个产品族,搭载格力空调的AB两款车子就属于另一个产品族。
抽象工厂模式的缺点:
(1)产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
(2)在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。