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

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)工厂模式针对的是一个产品等级结构,抽象工厂模式针对的是面向多个产品等级结构的。

最主要的是可以在类内部对产品族关联关系进行定义和描述。

【重要拓展概念】

产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。

举例说明,EngineAEngineB即为两个不同的等级结构,他们都衍生于Engine类。但是这里有海尔、格力两种空调,并且这两种空调都搭载到两种车子内(从这两个维度看,是有四种类型的车子了)。

那么搭载海尔空调的AB两款车子就属于同一个产品族,搭载格力空调的AB两款车子就属于另一个产品族。

 

抽象工厂模式的缺点:

1)产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。

2)在具体工厂类的方法中,对于产品族里的产品,只能使用其中一个。这也比较容易理解,比如,一款车子不可以搭载两种空调。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值