博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——抽象工厂模式详解
阅读量:4560 次
发布时间:2019-06-08

本文共 3131 字,大约阅读时间需要 10 分钟。

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

转载于:https://www.cnblogs.com/qitian1/p/6461555.html

你可能感兴趣的文章
grep,awk和sed
查看>>
.NET Core WebAPI IIS 部署问题
查看>>
SystemTap 静态探针安装包
查看>>
redis五种数据类型的使用
查看>>
浏览器全屏之requestFullScreen全屏与F11全屏
查看>>
软件包管理:rpm命令管理-安装升级与卸载
查看>>
旋转图像
查看>>
字符串中的数字(字符串、循环)
查看>>
15.select into
查看>>
运行web项目端口占用问题
查看>>
Java Spring-IOC和DI
查看>>
【NOIP1999】【Luogu1015】回文数(高精度,模拟)
查看>>
Linux上安装Python3.5
查看>>
crt安装
查看>>
git切换分支报错:error: pathspec 'origin/XXX' did not match any file(s) known to git
查看>>
c++中static的用法详解
查看>>
转 我修改的注册表,但是程序运行起来,还是记着以前的
查看>>
图片轮播功能
查看>>
第六周小组作业:软件测试和评估
查看>>
linux Cacti监控服务器搭建
查看>>