您的位置:首页 > 其它

设计模式——抽象工厂模式详解

2016-08-21 17:05 351 查看
0.前言
写在最前面,本人的设计模式类博文,建议先看博文前半部分的理论介绍,再看后半部分的实例分析,最后再返回来复习一遍理论介绍,这时候你就会发现我在重点处标红的用心,对于帮助你理解设计模式有奇效哦~
无论是工厂方法模式,还是抽象工厂模式,都属于工厂模式,在形式和特点上很相近,他们的最终目的都是为了解耦。
为了方便理解,看此篇之前请先理解工厂方法模式,可以阅读我之前写过的设计模式——工厂方法模式详解
 
了解完工厂方法模式我们会发现:
(1)多个具体产品类都衍生自同一个接口或抽象类。
(2)一个抽象工厂类,可以派生出多个具体工厂类。
(3)并且每个具体工厂类只能创建一个具体产品类的实例。
 
而抽象工厂模式是上述模式的升级版:
(1)多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。(看了后面的例子自然会懂~)
(2)一个抽象工厂类,可以派生出多个具体工厂类。(同工厂方法模式)
(3)并且每个具体工厂类可以创建多个具体产品类的实例。(看了后面的例子自然会懂~)
 
1.抽象工厂模式模式介绍
抽象工厂模式定义:
为创建一组相关或者是相互依赖的对象提供的一个接口,而不需要指定它们的具体类。
这个定义很抽象,不急,可以看完实例再返回来看一遍。
 
抽象工厂模式包括的角色:
(1)抽象产品类:为各种产品声明抽象接口或抽象类。
(2)具体产品类:抽象产品类的实现类,为实现某个具体产品的对象。
(3)抽象工厂类:声明了一组(注意是一组,看了下面的例子就会明白和工厂方法模式的区别)用于创建一种产品(每一个方法对应一种产品)的方法。
(4)具体工厂类:继承抽象工厂类,生成一组具体产品(注意是一组,这很重要)。

2. 抽象工厂模式的实现

下面是利用工厂方法模式“生产两款车子”的实例介绍,便于理解该模式如何运用。
在本例中,有两款车内空调品牌,分别为海尔和格力。也有两种发动机品牌,分别为国产和进口。
(这就是一开始所说的,抽象工厂模式有多个产品抽象类,分别为空调抽象类和发动机抽象类)
然后在本例中,对于A类车,搭载的是海尔空调和进口发动机。对于B类车,搭载的是格力空调和国产发动机。

[b]2.1 产品抽象接口和实现 
[/b]
下面是空调类。

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();

[b]3.  抽象工厂模式的优缺点
[/b]
抽象工厂模式的优点:
(1)具有工厂方法模式解耦的优点。
(2)工厂模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构的。
最主要的是可以在类内部对产品族的关联关系进行定义和描述。
【重要拓展概念】
产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。
举例说明,EngineA和EngineB即为两个不同的等级结构,他们都衍生于Engine类。但是这里有海尔、格力两种空调,并且这两种空调都搭载到两种车子内(从这两个维度看,是有四种类型的车子了)。
那么搭载海尔空调的AB两款车子就属于同一个产品族,搭载格力空调的AB两款车子就属于另一个产品族。
 
抽象工厂模式的缺点:
(1)产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。
(2)在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: