前言:以下总结来自龙哥---左潇龙博客。

总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html

  抽象工厂模式算是工厂相关模式的终极形态,它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品。这其实是工厂方法模式的一种扩展

  通常意义来我们谈到扩展,通常有两种方式可以扩展一个接口或者类,就是继承和组合。

  通常情况下,我们推荐使用组合扩展一个现有的类或接口,但这并非绝对,如果你扩展的子类或子接口与现有的类或接口明显是“是一个(is a)”的关系,也就是继承的关系,那么使用继承可以获得更多的好处。

  定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。

  定义中说了,我们是要创建一个接口,是为了创建一组相关或者相互依赖的对象,而且还有一点就是,我们创建的对象不是具体的类,也就是说我们创建的是一个接口或者一个抽象类。

 1 interface ProductA {
 2
 3     void methodA();
 4 }
 5
 6 interface ProductB {
 7
 8     void methodB();
 9 }
10
11 class ProductA1 implements ProductA{
12
13     public void methodA() {
14         System.out.println("产品A系列中1型号产品的方法");
15     }
16
17 }
18
19 class ProductA2 implements ProductA{
20
21     public void methodA() {
22         System.out.println("产品A系列中2型号产品的方法");
23     }
24
25 }
26
27 class ProductB1 implements ProductB{
28
29     public void methodB() {
30         System.out.println("产品B系列中1型号产品的方法");
31     }
32
33 }
34
35 class ProductB2 implements ProductB{
36
37     public void methodB() {
38         System.out.println("产品B系列中2型号产品的方法");
39     }
40
41 }
42
43 public interface Creator {
44
45     ProductA createProductA();
46
47     ProductB createProductB();
48
49 }
50
51 public class ConcreteCreator1 implements Creator{
52
53     public ProductA createProductA() {
54         return new ProductA1();
55     }
56
57     public ProductB createProductB() {
58         return new ProductB1();
59     }
60
61 }
62
63 public class ConcreteCreator2 implements Creator{
64
65     public ProductA createProductA() {
66         return new ProductA2();
67     }
68
69     public ProductB createProductB() {
70         return new ProductB2();
71     }
72
73 }
74
75 public class Client {
76
77     public static void main(String[] args) throws Exception {
78         Creator creator = new ConcreteCreator1();
79         ProductA productA = creator.createProductA();
80         ProductB productB = creator.createProductB();
81         productA.methodA();
82         productB.methodB();
83
84         creator = new ConcreteCreator2();
85         productA = creator.createProductA();
86         productB = creator.createProductB();
87         productA.methodA();
88         productB.methodB();
89     }
90 }

  抽象工厂模式一般是为了处理抽象产品多于一个的问题,而且这些产品多数情况下是有关系的。

  基于抽象工厂一旦定义,抽象产品的个数就已经固定,所以最好在抽象产品的个数不太会变化的情况下使用抽象工厂模式,当然,我们可以使用继承去弥补抽象工厂模式的这一不足,创造另外一个继承体系去扩展现有的框架。

三种设计模式依次进化的原因:

  1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。

       2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。

  我们在处理很多问题的时候其实是有很多种方式的,而且每一种方式可能都有各自的好处和坏处,很难去判断说那一种方式是最好的,而且也根本就没有这个说法,所以我们能做的,就是根据实际的情况去掂量各个方式的利弊,从而选择出一种更适合当前情况的处理方式。

转载于:https://www.cnblogs.com/hilter/p/8821306.html

05设计模式——抽象工厂模式相关推荐

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

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

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

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

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

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

  4. 一文学透设计模式——抽象工厂模式

    创建者模式 抽象工厂模式 概念 抽象工厂模式是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这是很多地方对于抽象工厂 ...

  5. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

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

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

  7. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  8. [设计模式] ------ 抽象工厂模式

    抽象工厂模式 抽象工厂模式,就是对工厂方法模式加以改进而已,其实就是用简单工厂模式的套路创建各个工厂,后面和工厂模式就一模一样了. 其实就是相当于将创建哪个工厂的权利再次放给调用端. 调用端在调用的时 ...

  9. Java常用设计模式————抽象工厂模式

    简介 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 与工厂方法模式的区别 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构,因此抽象工厂模式在结构上要比工厂方 ...

最新文章

  1. 机器学习导论(张志华):正定核性质
  2. 大学校运会计算机专业方阵,校运动会方阵策划案
  3. 删除github上的commit历史记录
  4. Mac 10.12安装IntelliJ出品的数据库管理工具DataGrip
  5. java 判断ip和port是否存活_java判断IP和端口号是否可以访问
  6. 深入V8引擎-Time核心方法之mac篇
  7. 查漏补缺!java主要包括哪几种开发平台
  8. C 语言基础——程序运行时间的计算
  9. Google Map Api 谷歌地图接口整理
  10. php fatal error解决,PHP中超时提示Fatal error: 解决办法
  11. Win10玩方舟生存进化崩溃怎么办?
  12. 从零到一黑苹果教程(10.15Catalina)
  13. 天津理工大学计算机学院绩点,天津理工大学花宇杰:平均绩点4.0你该这般青春昂扬...
  14. 学习使用php实现无限极评论和无限极转二级评论解决方案
  15. 区块链技术1---密码学基础
  16. C语言学习笔记10-指针(动态内存分配malloc/calloc、realloc、释放free,可变数组实现;Tips:返回指针的函数使用本地变量有风险!;最后:函数指针)
  17. niginx 转发请求原理
  18. STM32读取DS18B20温度,并在OLED上显示
  19. 诺基亚手机命名历史盘点
  20. 前端 css 通用css_编写CSS简易方法简易前端

热门文章

  1. mysqlierror php_php操作mysqli(示例代码)
  2. Express与传统Web应用(服务端渲染、art-template模板引擎、配置静态资源托管)
  3. 数据解析学习笔记(正则解析、bs4解析、xpath解析)
  4. 使用GRU单元的RNN模型生成唐诗
  5. LeetCode 1011. 在 D 天内送达包裹的能力(二分查找)
  6. LeetCode 187. 重复的DNA序列(哈希/位运算)
  7. LeetCode 1227. 飞机座位分配概率(DP+数学归纳法)
  8. 剑指Offer - 面试题10- II. 青蛙跳台阶问题
  9. LeetCode 451. 根据字符出现频率排序(map+优先队列)
  10. blue html中转换,BlueFox Free PDF to HTML Converter(PDF文件转换软件)