1、描述

通俗一点来讲,抽象工厂模式就是在工厂方法模式的抽象工厂类中规范多个同类产品。

工厂方法模式是针对一个产品系列的,而抽象工厂模式是针对多个产品系列的,即工厂方法模式是一个产品系列一个工厂,而抽象工厂模式是多个产品系列一个工厂类。

工厂模式中的每一个形态都是针对一定问题的解决方案,工厂方法针对的是多个产品系列结构;而抽象工厂模式针对的是多个产品族结构,一个产品族内有多个产品系列

2、适用性

抽象工厂模式可以看作工厂方法模式的扩展,在一个系统要由多个产品系列中的一个来配置时,工厂方法模式无法满足,这时就可以使用抽象工厂模式。这样介绍有点晦涩,下面通过实战代码的例子很好理解。

3、实现逻辑

  • 抽象产品类 :工厂类所创建的所有对象的超类,它负责描述所有实例所共有的公共接口。定义产品的规范,描述了产品的主要特性和功能。
  • 具体产品类 :实现或者继承抽象产品的子类;是工厂模式的创建目标,所有创建的对象都是这个具体类的实例。在抽象工厂模式中某具体产品有专门的具体工厂类创建,但不同于工厂方法模式,它们之间是一对多的关系,及一个具体工厂类可以创建多个具体产品类。
  • 抽象工厂类:是工厂方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。制定具体工厂类的规范。
  • 具体工厂类:主要是实现抽象工厂中的抽象方法,完成具体产品的创建。可供客户端直接调用某一方法创建出具体产品实例。

4、实战代码

之前的工厂方法模式,我们用的 Tea 和 Coffee 为例。但是在实际生活中,Tea 和 Coffee 都有着许多种类。下面我们通过 BlackTea 和 GreenTea 以及 Nestle 和 Latte 这个几种饮品为具体产品类,DrinksAFactory 和 DrinksBFactory 为分别可以创建 BlackTea 、Nestle 和 GreenTea 、Latte 的工厂类来简单演示抽象工厂模式。

/*** 抽象产品类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:19:25*/
public abstract class Tea {
}/*** 具体产品类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:21:19*/
public class BlackTea extends Tea {public BlackTea() {System.out.println("BlackTea");}
}/*** 具体产品类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:21:56*/
public class GreenTea extends Tea{public GreenTea() {System.out.println("GreenTea");}
}/*** 抽象产品类** @author Eajur.Wen* @version 1.0* @date 2022-11-05 18:26:36*/
public abstract class Coffee {
}/*** 具体产品类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:22:26*/
public class Nestle extends Coffee {public Nestle() {System.out.println("Nestle");}
}/*** 具体产品类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:23:15*/
public class Latte extends Coffee {public Latte() {System.out.println("Latte");}
}/*** 抽象工厂类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 08:03:13*/
public interface DrinksFactory {Coffee createCoffee();Tea createTea();
}/*** 具体工厂类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:26:53*/
public class DrinksAFactory implements DrinksFactory {@Overridepublic Coffee createCoffee() {return new Nestle();}@Overridepublic Tea createTea() {return new BlackTea();}
}/*** 抽象工厂类** @author Eajur.Wen* @version 1.0* @date 2022-11-06 20:26:53*/
public class DrinksBFactory implements DrinksFactory {@Overridepublic Coffee createCoffee() {return new Latte();}@Overridepublic Tea createTea() {return new GreenTea();}
}/*** 测试类** @author Eajur.Wen* @version 1.0* @date 2022-11-05 18:41:14*/
public class Client {public static void main(String[] args) {DrinksFactory drinksAFactory = new DrinksAFactory();Coffee coffeeA = drinksAFactory.createCoffee();Tea teaA = drinksAFactory.createTea();DrinksFactory drinksBFactory = new DrinksBFactory();Coffee coffeeB = drinksBFactory.createCoffee();Tea teaB = drinksBFactory.createTea();}
}

客户端执行结果:

从结果可以看出,A 工厂和 B 工厂根据同样的方法创建不同系列的实例。实际开发中, 系统中有多个产品族,但每次只使用其中的某一族产品。

例如,有的人喜欢 APPLE 品牌,有的人喜欢华为品牌。然后手机、手表、平板都打算使用同一系列,这种情况就非常符合抽象工厂模式。

23种设计模式-抽象工厂模式介绍加实战代码相关推荐

  1. 23种设计模式-抽象工厂模式《三国王者》

    对于许久不用的东西,容易忘记.百度许久,也未能找到自己所要. 从今日起,有些东西就记载下来,不仅方便自己,希望能帮到他人吧! 定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体 ...

  2. 23种设计模式——抽象工厂模式

    目录 抽象工厂模式(AbstractFactory) 产品族 理解 UML图 优缺点 应用场景 抽象工厂模式VS和工厂模式 实例 数据访问(工厂方法) 数据访问(抽象工厂) 用简单工厂改造抽象工厂 C ...

  3. 23种设计模式之工厂模式学习笔记

    什么是工厂模式? 工厂顾名思义就是创建产品,根据产品是具体产品还是具体工厂可分为简单工厂模式和工厂方法模式,根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式.该模式用于封装和管理对象的创建,是一种创 ...

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

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

  5. 23种设计模式——装饰者模式

    文章目录 23种设计模式--装饰者模式 1.装饰者模式概述 2.装饰者模式的结构 3.装饰者模式的实现 4.装饰者模式的应用场景 23种设计模式--装饰者模式 1.装饰者模式概述 背景 有些人为了早上 ...

  6. 实践GoF的23种设计模式:建造者模式

    本文分享自华为云社区<[Go实现]实践GoF的23种设计模式:建造者模式>,作者: 元闰子. 简述 在程序设计中,我们会经常遇到一些复杂的对象,其中有很多成员属性,甚至嵌套着多个复杂的对象 ...

  7. 23种设计模式7_代理模式之一静态代理

    23种设计模式7_代理模式之一静态代理 1 基本介绍 代理模式:为其他对象提供一种代理以控制对这个对象的访问 代理模式也叫委托模式,它是一项基本设计技巧.许多其他的模式,如状态模式.策略模式.访问者模 ...

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

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

  9. 【Go实现】实践GoF的23种设计模式:命令模式

    上一篇:[Go实现]实践GoF的23种设计模式:代理模式 简单的分布式应用系统(示例代码工程):https://github.com/ruanrunxue/Practice-Design-Patter ...

最新文章

  1. 预、自训练之争:谷歌说预训练虽火,但在标注数据上自训练更有效
  2. 【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )
  3. hash redis springboot_Redis常见的工作场景使用实战,Redisson分布式锁的实现
  4. 今天的雪糕格外好吃!
  5. anaconda在ubuntu中添加环境变量
  6. 《图像理解理论与方法》(1)
  7. vim设置tab宽度为4_vim编辑器VimScript插件开发系列一「定制Vim 3」
  8. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_02-项目概述-功能构架-功能模块和项目原型...
  9. IDEA——一个项目启动多个服务
  10. gradle报错this sometimes occurs after a network connection timeout.解决
  11. matlab里det函数的神奇bug
  12. 华为手机鸿蒙系统手机_升级快讯:又一批华为手机可以升级到“鸿蒙系统”了!...
  13. 新旧电脑数据如何迁移?电脑数据导入到另一台电脑
  14. 51单片机学习——4--数码管显示
  15. 大学英语计算机my dream 150,MYDREAM英语作文150字带中文翻译
  16. DLR in Silverlight
  17. 读书笔记——袁岳_趁年轻,折腾吧
  18. CentOS7配置nexus开机自启动
  19. CSDN如何导出为pdf文档?
  20. 金融无疆界 风险无极限——中国金融的未来之路

热门文章

  1. css取第一个孩子,CSS:第n个孩子():后(css :nth-child() :after)
  2. ChatBot framework 开发实践
  3. android jni dlopen,[原创]andorid linker 解读1----从loadLibrary到dlopen
  4. 谁动了我们的DNS,是你吗,流氓?
  5. 王守义说13香,那iPhone12到底香不香?
  6. Mac Homebrew 安装与卸载
  7. 对警报线程池的警报线程_警报引起的辛劳
  8. Google Android GMS全家桶
  9. 美团点评学龄前儿童营养午餐公益项目落地湖南湘西
  10. Deep learning翻译