抽象工厂模式定义

工厂方法模式中工厂只负责同类产品的生产。比如电视机工厂不应该生产汽车。

然而现实生活中有很多综合型的工厂,比如有些电视工厂不仅生产电视机,还会生产与之配套的机顶盒。

那么抽象工厂模式随之诞生,这种模式将考虑多种类型产品的生产。

我们总结下:

  • 工厂方法模式只考虑成产同一等级级的产品

  • 抽象方法模式考虑生产多等级的产品,可以说是工厂方法模式的升级版

如上图,小米音响和苹果音响为同一个产品。而小米手机和小米音响为同一产品族。

使用场景

那么什么情况下可以使用抽象工厂模式?

使用抽象工厂模式一般要满足以下条件。

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。

  • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

抽象工厂模式同工厂方法模式结构一样,需要抽象产品,抽象工厂,具体产品,具体工厂4部分组成。

结构图如下:

实现代码

这个图你可能看着头晕,我们用代码来表示:

首先创建抽象工厂AbstractFactory

public interface AbstractFactory {Product1 newProduct1();Product2 newProduct2();
}

然后在创建两个抽象产品

/*** 手机*/
public interface Product1 {void show();
}/*** 音响*/
public interface Product2 {void show();
}

然后创建具体产品

public class ConcreteProduct11 implements Product1 {@Overridepublic void show() {System.out.println("具体产品11显示【小米-手机】...");}
}public class ConcreteProduct12 implements Product1 {@Overridepublic void show() {System.out.println("具体产品12显示【苹果-手机】...");}
}public class ConcreteProduct21 implements Product2 {@Overridepublic void show() {System.out.println("具体产品21显示【小米-音响】...");}
}public class ConcreteProduct22 implements Product2 {@Overridepublic void show() {System.out.println("具体产品22显示【苹果-音响】...");}
}

再创建具体工厂ConcreteFactory1用来生产小米产品【小米-手机,小米-音响】

/*** Description: 小米工厂** @author Lvshen* @since JDK 1.8*/
public class ConcreteFactory1 implements AbstractFactory {public Product1 newProduct1() {System.out.println("具体工厂 1 【小米工厂】 生成-->具体产品 11...");return new ConcreteProduct11();}public Product2 newProduct2() {System.out.println("具体工厂 1 【小米工厂】 生成-->具体产品 21...");return new ConcreteProduct21();}
}

ConcreteFactory1用来生产苹果产品【苹果-手机,苹果-音响】

/*** Description: 苹果工厂** @author Lvshen* @since JDK 1.8*/
public class ConcreteFactory2 implements AbstractFactory {public Product1 newProduct1(){System.out.println("具体工厂 2 【苹果工厂】生成-->具体产品 12...");return new ConcreteProduct12();}public Product2 newProduct2(){System.out.println("具体工厂 2 【苹果工厂】生成-->具体产品 22...");return new ConcreteProduct22();}
}

测试

我们使用小米工厂,生产小米手机

@Slf4j
public class FactoryTest {@Testpublic void test() {ConcreteFactory1 concreteFactory1 = new ConcreteFactory1();Product1 product1 = concreteFactory1.newProduct1();product1.show();}
}

测试结果

我们再来用苹果工厂生产苹果音响

@Slf4j
public class FactoryTest {@Testpublic void test() {ConcreteFactory2 concreteFactory = new ConcreteFactory2();Product2 product = concreteFactory.newProduct2();product.show();}
}

测试结果

关于抽象工厂模式的思考

当新增一条产品族时,只需要新增一个工厂即可。比如新增华为手机,华为音响,我们就需要需新增华为工厂。

如果新增新产品等级的产品,那么就需要修改工厂。假如我们新增了手环产品,比如小米手环,苹果手环,华为手环。那么,每个工厂都需要修改。这并不满足闭开原则。

我们再总结下什么情况下会使用抽象工厂模式:

  • 系统中有多个产品族,但每次只使用其中的某一族产品。比如我就喜欢专门使用小米的手机和手环

  • 系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构

同工厂模式一样,抽象工厂模式的优点在于,我们不需要知道产品是如何创建的。要获取产品对象,通过工厂就可以获取。做到了很好的封装。

如果产品族类的产品与产品之间存在约束,比如小米手环和小米手机有一定的约束【小米手环需要与小米手机配对才能激活小米手环(这里我瞎说,只是举个栗子

设计模式3之抽象工厂模式相关推荐

  1. 设计模式C#描述——抽象工厂模式

    设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...

  2. 设计模式二、抽象工厂模式

    设计模式part2 1.     抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题, ...

  3. JavaScript 23 种设计模式之 4 抽象工厂模式

    JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...

  4. 设计模式普及之抽象工厂模式

    本文是读<Android源码设计模式解析与实战>后笔记 抽象工厂的定义 为创建一组相关或者是相互依赖的对象提供一个借口,而不需要指定它们的具体类. 抽象工厂的使用场景 一个对象族有相同的约 ...

  5. 【设计模式】之抽象工厂模式

    创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...

  6. java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式

    抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...

  7. java设计模式六(抽象工厂模式)

    java设计模式-抽象工厂模式 一.概述 抽象工厂模式是在工厂模式的基础上,加上了一个管理工厂的超级工厂.也就是说,工厂的作用是管理各种有相似功能的类,而超级工厂的作用是管理这些工厂. 二.模式示例: ...

  8. 【设计模式】之抽象工厂模式详解与应用(三)

    开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...

  9. 设计模式之笔记--抽象工厂模式(Abstract Factory)

    抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...

  10. 设计模式之【抽象工厂模式】

    抽象工厂模式 (Abstract Factory Pattern) 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品 ...

最新文章

  1. 【转】【UML】使用Visual Studio 2010 Team System中的架构师工具(设计与建模)
  2. java克鲁斯卡尔算法_Java语言基于无向有权图实现克鲁斯卡尔算法代码示例
  3. md5加密解密代码_Python内置方法实现基于秘钥的信息加解密
  4. 分享Silverlight/WPF/Windows Phone一周学习导读(12月20日-12月26日)
  5. SVN移植、合库、分库
  6. 15个基本不定积分公式和分类基本积分表
  7. 微信支付?一起观摩Safesound勒索病毒的骚操作
  8. python语言简单界面选择苏康码图片文字识别
  9. 通过创建Google快讯将定期搜索结果发送到Gmail信箱
  10. 同方有云,加速领跑信创新时代
  11. 安装计算机一级出现appcrash,电脑appcrash的问题怎么修复
  12. EXCEL 2013中“定义名称”的命名规则
  13. python correlate_关于numpy互相关函数np.correlate的一点疑问
  14. 高新技术企业研发费用占比要求是多少
  15. 做计算机的小卫士教案,小学信息技术教案四年级上环保小卫士
  16. python3使用代理 报错MaxRetryError
  17. 解决qq安全防护更新进程总提示的方法
  18. 三款主流文件校验码工具HashCalc、WinMD5、Hasher
  19. Win11右下角时间怎么显示星期几?
  20. python常见的数据类型是_python基本数据类型都在这里

热门文章

  1. 无字母数字webshell总结
  2. 2021年N1叉车司机考试题库
  3. BookShop项目开发的一个小结
  4. 信息安全数学基础 第4章 二次同余式与平方剩余
  5. 【错误记录】Android Studio 编译报错 ( Execution failed for task ‘:APP_MIDI:lintVitalRelease‘. )
  6. 使用 vscode 安装配置 clang-format(代码格式化)
  7. 【安全利器SELinux快速入门系列 | 02】SELinux 策略实施的可视化操作指南
  8. 番茄钟怎么设置,教你用便签设置番茄钟
  9. Xcode13 The Legacy Build System will be removed in a future release.
  10. AX88772B 驱动移植