通过前篇文章《设计模式:工厂模式,解除耦合的利器》的介绍,我们对工厂模式有了深入的了解,今天继续介绍一种特殊的工厂模式,也就是抽象工厂模式。

定义

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式,是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

抽象工厂模式包含了几个角色:

AbstractFactory:用于声明生成抽象产品的方法

ConcreteFactory:实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;

AbstractProduct:为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;

Product:定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

这是它的通用类图:

其中 AbstractProductA 和 AbstractProductB 就是两个产品族的抽象类 (或者接口),而 Product1 和 Product2 就是产品族下的具体产品类,AbstractCreator 就是工厂的抽象。

我们可以用操作系统来举例,现在市面上用的最多的两种PC端操作系统是windows和Linux,两个系统都有共同类型的组件,如文件夹,按钮,文本等。套用下抽象工厂的通用类图,我们不难发现,两个系统就相当于产品组抽象类AbstractProductA 和 AbstractProductB,而按钮、文本这些组件就是具体的产品类。

然后再来分析一下,如果有一个应用要在两个系统上运行,应该怎么设计?是编写两套程序运行于不同的系统上?这样实在是太浪费资源了,我们可以通过抽象工厂模式屏蔽掉操作系统对应用的影响。软件功能、逻辑、UI 都一个非常类似,唯一的不同是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息,而这就是抽象工厂的优势。

代码编写

抽象工厂的通用类图我们已经了解了,下面就是具体代码的实现:

产品族的抽象类,AbstractProductAAbstractProductB

public abstract class AbstractProductA {//每个产品共有的方法public void shareMethod() {}// 每个产品相同方法,不同实现public abstract void doSomething();
}
public abstract class AbstractProductB {//每个产品共有的方法public void shareMethod() {}// 每个产品相同方法,不同实现public abstract void doSomething();
}

两个产品族的具体实现类代码,

public class ProductA1 extends AbstractProductA {public void doSomething() {System.out.println("我是产品A1");}
}
public class ProductA2 extends AbstractProductA {public void doSomething() {System.out.println("我是产品A2");}
}
public class ProductB1 extends AbstractProductB {public void doSomething() {System.out.println("我是产品B1");}
}
public class ProductB2 extends AbstractProductB {public void doSomething() {System.out.println("我是产品B2");}
}

抽象工厂类AbstractCreator,有N个产品族,在抽象工厂类中就应该有N个创建方法。我们这里定义两个产品族的产品创建,代码如下:

public abstract class AbstractCreator {//创建A产品public abstract AbstractProductA createProductA();//创建B产品public abstract AbstractProductB createProductB();
}

然后是创建产品的具体工厂,有N个产品等级就应该有N个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务。

public class Creator1 extends AbstractCreator {public AbstractProductA createProductA() {return new ProductA1();}public AbstractProductB createProductB() {return new ProductB1();}
}
public class Creator2 extends AbstractCreator {public AbstractProductA createProductA() {return new ProductA2();}public AbstractProductB createProductB() {return new ProductB2();}
}

到此为止,我们把所有的角色都创建出来了,最后设计一个场景类,验证下是否能输出对应产品的信息,

public class Client {public static void main(String[] args) {//定义出两个工厂AbstractCreator creator1 = new Creator1();AbstractCreator creator2 = new Creator2();//产生A1对象AbstractProductA a1 = creator1.createProductA();//产生A2对象AbstractProductA a2 = creator2.createProductA();//产生B1对象AbstractProductB b1 = creator1.createProductB();//产生B2对象AbstractProductB b2 = creator2.createProductB();a1.doSomething();a2.doSomething();b1.doSomething();b2.doSomething();}
}

运行的结果为:

我是产品A1
我是产品A2
我是产品B1
我是产品B2

总结

总结下抽象工厂模式的特点,抽象工厂是所有形式的工厂模式中最为抽象和最具一般性的一种形态,其优缺点大致如下:

1、隔离了具体类的生成,使得客户并不需要知道什么被创建,具有良好的封装性。

2、横向扩展容易。同个产品族如果需要增加多个 产品,只需要增加新的工厂类和产品类即可。

3、纵向扩展困难。如果增加新的产品组,抽象工厂类也要添加创建该产品组的对应方法,这样一来所有的具体工厂类都要做修改了,严重违背了开闭原则。

参考:
《设计模式之禅》

设计模式:抽象工厂模式,结合类图秒懂!相关推荐

  1. java设计模式之工厂模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  2. C++设计模式--抽象工厂模式

    前言 前面有两篇文章分别介绍了简单工厂模式和工厂方法模式,这两种模式都比较常见,今天介绍工厂模式的最后一种,抽象工厂模式. 抽象工厂模式(Abstract Factory Pattern)是所有形态的 ...

  3. C# 设计模式----抽象工厂模式

    原文地址:C#设计模式(4)--抽象工厂模式 一.引言 在上一专题中介绍了工厂方法模式,工厂方法模式是为了克服简单工厂模式的缺点而设计出来的,简单工厂模式的工厂类随着产品类的增加需要增加额外的代码), ...

  4. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  5. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  6. C#设计模式--抽象工厂模式

    一.抽象工厂详细介绍 这里首先以一个生活中抽象工厂的例子来实现一个抽象工厂,然后再给出抽象工厂的定义和UML图来帮助大家更好地掌握抽象工厂模式,同时大家在理解的时候,可以对照抽象工厂生活中例子的实现和 ...

  7. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  8. C++设计模式-抽象工厂模式

    目录 基本概念 代码与实例 基本概念 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,从而无需指定他们具体的类. 抽象工厂的好处: 1. 易于交换产品系列 ...

  9. 深入理解设计模式-抽象工厂模式

    文章目录 一.定义 二.使用场景 三.代码样例 1.需求 2.类图 3.实体类 4.产品类 5.工厂类 6.客户端 四.优缺点 结尾 一.定义 抽象工厂模式隶属于设计模式中的创建型模式,用于产品族的构 ...

  10. Java设计模式——抽象工厂模式

    文章目录 抽象工厂 概念 优缺点 优点 缺点 适用场景 代码案例 抽象工厂 使用工厂方法模式足以应付我们可能遇到的大部分业务需求. 但是当产品种类非常多时,就会出现 大量的与之对应的工厂类,这不应该是 ...

最新文章

  1. php中input的使用,php输入流php://input如何使用
  2. 这些赛道设计的点子,不让用太可惜了 | 赛道审核环节
  3. 动态链接(指向运行时常量池的方法引用)
  4. Network of Schools(POJ-1236)
  5. python爬虫之request_Python爬虫:Scrapy研读之Request/Reponse
  6. [spring boot]idea中实现热部署的方法
  7. (13)<datalist> 标签
  8. 外媒:苹果聘请更多司机在加州测试其自动驾驶汽车
  9. 糖尿病监测中国际通用的“金标准”
  10. php中英文版切换最好的办法,php做项目进行中英文的切换,如何快速实现
  11. 有关node.js学习笔记
  12. 创建Win2003域和Win2008域之间的信任关系,Active Directory系列之十八
  13. 向量场的方向导数仍为向量场
  14. java通过poi转换ppt/pptx内容,输出为PNG图片。
  15. ExtJS4 时间在edge中显示为0NaN-NaN-NaN NaN:NaN
  16. 【Windows】hiberfil.sys相关操作
  17. 2020阿里云云栖大会奖品活动汇总(持续更新,快收藏)
  18. 用投资思维做好招商工作:湘商回归,长沙急企业之所急
  19. HTTP Referer(页面统计/资源防盗链)
  20. PythonJS宏 实现保留样式合并表格后拆分

热门文章

  1. 《FLUENT 14流场分析自学手册》——第2章 流体流动分析软件概述 2.1 CFD软件简介...
  2. 基于人口普查数据的收入预测模型构建及比较分析(Python数据分析分类器模型实践)
  3. 基于tkinter的九型人格测试系统介绍
  4. python修改app定位_APP自动化中三大定位工具
  5. 邻接矩阵实现无向图的创建并根据louvain算法实现分区
  6. 几款免费开源的企业管理软件
  7. 高响应比优先调度算法(HRRN)例题详解
  8. 在 vi 中替换字符串
  9. 超参数调整——网格搜索
  10. 【微课堂】汽车软件工程解决方案(现场实录)