深入浅出设计模式 - 抽象工厂模式

news2024/11/13 10:25:08

博主介绍: ✌博主从事应用安全和大数据领域,有8年研发经验,5年面试官经验,Java技术专家✌

Java知识图谱点击链接:体系化学习Java(Java面试专题)

💕💕 感兴趣的同学可以收藏关注下不然下次找不到哟💕💕

在这里插入图片描述

文章目录

  • 1、什么是抽象工厂模式
  • 2、抽象工厂模式优缺点
  • 3、抽象工厂模式的结构
  • 4、抽象工厂模式的代码案例
  • 4、抽象工厂模式的应用场景

1、什么是抽象工厂模式

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。它是工厂方法模式的扩展,它通过组合多个工厂方法模式来实现一组对象的创建。

在抽象工厂模式中,有一个抽象工厂类负责定义创建一系列相关或相互依赖对象的接口,而具体的工厂类实现这个接口来创建具体的对象。每个具体的工厂类都负责创建一组对象,这些对象之间有一定的关联关系,可以满足一些特定的需求。

抽象工厂模式的优点是可以在不修改客户端代码的情况下,增加或修改一组对象的创建方式。同时,它能够保证一组对象的创建是相互依赖的,并且可以保证这些对象之间的兼容性。

抽象工厂模式的缺点是增加新的产品族比较困难,需要修改抽象工厂接口和所有的具体工厂类,同时也会增加系统的复杂度。

2、抽象工厂模式优缺点

抽象工厂模式的优点:

  1. 抽象工厂模式可以将一组相关的产品族统一到一起创建,使得客户端更加方便使用这些产品。
  2. 抽象工厂模式可以保证产品之间的兼容性,因为同一个工厂创建的产品都是相互配合使用的。
  3. 抽象工厂模式可以隔离具体类的生成,使得客户端不需要知道具体的类名,只需要知道工厂的名字即可。

抽象工厂模式的缺点:

  1. 抽象工厂模式的扩展性较差,新增一个产品族时需要修改抽象工厂接口和所有的具体工厂类。
  2. 抽象工厂模式的代码量较大,因为需要定义很多抽象类和接口。
  3. 抽象工厂模式只适用于产品族的创建,不适用于单个产品的创建。如果只需要创建单个产品,建议使用工厂方法模式。

3、抽象工厂模式的结构

抽象工厂模式的结构包括以下几个部分:

  1. 抽象工厂(Abstract Factory):定义了一个接口,用于创建一组相关或者相互依赖的对象。
  2. 具体工厂(Concrete Factory):实现了抽象工厂接口,用于创建一组具体的产品。
  3. 抽象产品(Abstract Product):定义了产品的接口,用于描述产品的属性和行为。
  4. 具体产品(Concrete Product):实现了抽象产品接口,具体产品是由具体工厂创建的。

抽象工厂模式的结构可以用以下 UML 类图表示:

|   AbstractFactory |       |   AbstractProduct |
 -----------------          -----------------
| + createProductA()|<------| + operation()     |
| + createProductB()|        -----------------
 -----------------                 ^
        ^                          |
        |                          |
 -----------------          -----------------
|  ConcreteFactory |        |  ConcreteProduct |
 -----------------          -----------------
| + createProductA()|<------| + operation()     |
| + createProductB()|        -----------------
 -----------------

在这个结构中,抽象工厂定义了创建一组相关产品的接口,具体工厂实现了抽象工厂接口,用于创建一组具体的产品。抽象产品定义了产品的接口,具体产品实现了抽象产品接口,是由具体工厂创建的。客户端通过抽象工厂和抽象产品来使用具体工厂和具体产品,从而实现了产品族的创建。

4、抽象工厂模式的代码案例

抽象产品类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  抽象产品类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 12:08
 */
public interface Button {
    void paint();
}

具体产品类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体产品类 - Windows
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:08
 */
public class WindowsButton implements Button {
    @Override
    public void paint() {
        System.out.println("Windows Button");
    }
}
package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体产品类 - Mac
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:08
 */
public class MacButton implements Button {
    @Override
    public void paint() {
        System.out.println("Mac Button");
    }
}

抽象工厂类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  抽象工厂类
 * @copyright: @Copyright (c) 2022
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0
 * @createTime: 2023-06-27 12:09
 */
public interface GUIFactory {
    Button createButton();
}

具体工厂类:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体工厂类 - WindowsFactory
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:09
 */
public class WindowsFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new WindowsButton();
    }
}


package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  具体工厂类 - MacFactory
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:10
 */
public class MacFactory implements GUIFactory {
    @Override
    public Button createButton() {
        return new MacButton();
    }
}

客户端代码:

package com.pany.camp.design.principle.abs;

/**
 *
 * @description:  客户端
 * @copyright: @Copyright (c) 2022 
 * @company: Aiocloud
 * @author: pany
 * @version: 1.0.0 
 * @createTime: 2023-06-27 12:10
 */
public class Client {
    private Button button;

    public Client(GUIFactory factory) {
        button = factory.createButton();
    }

    public void paint() {
        button.paint();
    }

    public static void main(String[] args) {
        Client windowsClient = new Client(new WindowsFactory());
        Client macClient = new Client(new MacFactory());
        windowsClient.paint();
        macClient.paint();
    }
}

输出如下:

Windows Button
Mac Button

Process finished with exit code 0

4、抽象工厂模式的应用场景

抽象工厂模式在 Java 中的应用场景包括:

  1. 当需要创建一组相关或相互依赖的对象时,使用抽象工厂模式可以将对象的创建过程封装起来,使得客户端不需要知道具体的实现细节。
  2. 当需要在不同的平台或环境下使用不同的实现时,使用抽象工厂模式可以使得客户端代码与具体实现解耦,从而更容易进行维护和扩展。
  3. 当需要支持多种不同类型的产品,且这些产品之间存在一定的关联关系时,使用抽象工厂模式可以将不同类型的产品的创建过程封装起来,使得客户端可以方便地使用这些产品。
  4. 当需要在运行时动态地更改产品的实现时,使用抽象工厂模式可以使得客户端代码与具体实现解耦,从而更容易进行动态配置和管理。

总之,抽象工厂模式适用于需要创建一组相关或相互依赖的对象,并且需要支持多种不同类型的产品,或者需要在不同的平台或环境下使用不同的实现的情况。

在这里插入图片描述

💕💕 本文由激流原创,首发于CSDN博客,博客主页 https://blog.csdn.net/qq_37967783?spm=1010.2135.3001.5421
💕💕喜欢的话记得点赞收藏啊

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/691153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化测试框架[Cypress概述]

目录 前言&#xff1a; Cypress简介 Cypress原理 Cypress架构图 Cypress特性 各类自动化测试框架介绍 Selenium/WebDriver Karma Karma的工作流程 Nightwatch Protractor TestCafe Puppeteer 前言&#xff1a; Cypress是一个基于JavaScript的端到端自动化测试框架…

个人自我评价格式范文五篇

★个人自我评价1 工作已经进行两周多了&#xff0c;突然发现自己似乎又重蹈覆辙了&#xff0c;再一次一次的不经意中和某些人的就距离却是越来越来大&#xff0c;总是想偷一下懒&#xff0c;总是想着马马虎虎过去算了&#xff0c;没有那么精打细算过。结果不经意有些人人开始脱…

android的项目下的res文件夹下的部分文件夹介绍

1.看图 drawable文件夹下的图片是不压缩的图片 drawable-xhdpi文件夹下的图片是适合指定分辨率的图片 mipmap-xxhdpi文件夹下的图片是小型设备分辨率的图片

基于物联网、云计算建设的智慧校园云平台源码

电子班牌作为班级文化展示交流的窗口&#xff0c;可以让更多的人看到校园信息建设与班级风格相结合&#xff0c;及时传递校园信息。学生也可以通过电子班牌看到学校近期重要事件的发布&#xff0c;也可以参与回复&#xff0c;让学生及时掌握校园和班级动态。同时&#xff0c;还…

版本管理可视化工具GitKraKe安装

资源下载地址 https://download.csdn.net/download/u012796085/87953404 1 解压后安装GitKrakenSetup-7.5.5.exe 2 命令窗口进入GitKraken存放目录&#xff0c;分别执行以下语句 git clone https://gitee.com/pan13640612207/GitKraken.git cd GitKraken/ yarn install yarn…

STM32使用STM32CUBEMX配置FreeRTOS+SDIO4bit+FATFS注意事项

一、使用STM32CUBEMX配置FreeRTOSSDIO4bitFATFS注意事项&#xff1a; 以STM32F429为例&#xff1a; 1、SDIO配置 配置为4bit模式&#xff0c;此配置不是最终配置&#xff0c;后面会在代码进行修改。 2、Fatfs配置 Set Defines 选项中的配置可以默认&#xff0c;最重要注意Ad…

git配置和git合并

git配置&#xff1a; 首先下载安装git&#xff1a;https://git-scm.com/downloads/ 一路默认&#xff0c;安装完成后&#xff0c;打开文件夹C:\Users\Administrator\.ssh&#xff08;Administrator是当前用户名&#xff09;&#xff0c;在空白处点鼠标右键选择“Git Bush Her…

资源分享开发系统

资源分享系统-开放 提示&#xff1a;开源是学习的来源&#xff0c;分享是进步的体现 近期&#xff0c;使用springboot结合layui写了一个技术管理系统&#xff0c;其实最主要是做一些资源的分享&#xff0c;可便捷生活和学习&#xff0c;包括免费听音乐的网站&#xff0c;免费…

和鲸助力中国大学生计算机设计大赛国赛作品评审标准落实研讨会召开,专家平台首发布

6月16日至19日&#xff0c;中国大学生计算机设计大赛国赛作品评审标准落实研讨会&#xff08;第一期&#xff09;在天津召开&#xff0c;本次会议由中国大学生计算机设计大赛组委会主办&#xff0c;南开大学承办&#xff0c;和鲸社区参与协办。 会议由中国人民大学杜小勇教授、…

GPIO模拟时序控制外设1——WS2812B

文章目录 前言WS2812B1.模块简介2.时序介绍3.硬件介绍4.传输速率&#xff0c;以及帧数要求 代码1.初始化2.模拟时序1.复位函数2.发送0、1码3.封装发送函数 总结 前言 上一篇文章中介绍了整个板子的最基本功能模块——使用GPIO的通用输入输出实现简单的按键输入以及推挽输出控制…

【若依分离版操作方法日志与其它业务数据(如入库操作)关联的实现】

若依框架业务表和操作日志表关联 需求&#xff1a;分析&#xff1a;思路&#xff1a;实现: 需求&#xff1a; 基于若依分离版框架业务数据与操作日志的数据做个关联 入库表 /*入库业务表 */ CREATE TABLE [BS_In]( [Id] int IDENTITY(1,1)…

【MySQL 主从复制与读写分离】

目录 一、MySQL主从复制1.1、主从复制架构和原理1.2、MySQL的扩展1.2.1、什么是读写分离1. 读写分离的基本原理2. MySQL 读写分离原理 1.2.2、为什么要读写分离1.2.3、什么时候要读写分离1.2.4、主从复制与读写分离1.2.5、mysql支持的复制类型 1.3、复制的共用1.4、复制架构1.5…

2023年下半年北京/上海/深圳NPDP产品经理认证招生

产品经理国际资格认证NPDP是新产品开发方面的认证&#xff0c;集理论、方法与实践为一体的全方位的知识体系&#xff0c;为公司组织层级进行规划、决策、执行提供良好的方法体系支撑。 【认证机构】 产品开发与管理协会&#xff08;PDMA&#xff09;成立于1979年&#xff0c;是…

java学习记录之DBUtils

1 jdbc回顾 1.1 批处理  Statement 执行多条sql addBatch(sql) clearBatch() int[] executeBatch()  PreparedStatement 执行一条sql语句&#xff0c;多组参数 addBatch() 执行之前必须设置实际参数 psmt.setXxxx() clearBatch() executeBatch() 1.2 事务  事务&…

SpringBoot 整合redis + Aop防止重复提交 (简易)

1.redis的安装 redis下载 解压 安装 # wget http://download.redis.io/releases/redis-6.0.8.tar.gz # tar xzf redis-6.0.8.tar.gz # cd redis-6.0.8 # make 看一下就会有 进入redis-6.0.8下的src目录 [rootVM-16-8-centos redis]# cd redis-6.0.8 [rootVM-16-8-centos re…

【Java】Java 中的引用类型

本文仅供学习参考&#xff01; Java是一种类型化语言&#xff0c;这本质上意味着声明的每个变量都有与之关联的特定类型。此类型确定它可以存储的值。例如&#xff0c;整数类型可以存储非小数。也称为数据类型&#xff0c;这可以大致分为两类&#xff1a;基元和引用。基元类型是…

华为云GaussDB,能否成为数据库国产化替代的“更优选择”?

没有一个行业比数据库更需要长期主义&#xff0c;而在践行长期主义的道路上&#xff0c;国内数据库厂商中华为是不可忽视的存在。 近日&#xff0c;Gartner Peer Insights《Voice of the Customer for Cloud Database Management Systems&#xff0c;2023》报告发布&#xff0…

使用python unittest从零构建web应用的自动化测试用例

文章目录 必要性使用pycharm搭建unittest框架selenium下载web driverweb driver的基本使用driver 定位元素driver使用事件处理下拉框处理复选框 sshftp数据库sqlserveroracle安装使用 mongodb excelpycurl 必要性 大部分团队起始对于要不要投入资源进行UI自动化测试的开发都是…

泰裤辣!Corona 10强势来袭,蓝海创意云同步更新支持

2023年6月22日&#xff0c;Chaos Corona官网发布了Chaos Corona 10 for 3ds Max and Cinema 4D版本。本次不仅更新了新功能&#xff0c;还优化了渲染卡顿的问题&#xff0c;一起来看看有哪些实用的好玩意吧&#xff01; 1.贴花影响特定通道 CR10在你的场景中焕然一新&#xff…

Git报错: Please move or remove them before you switch branches.

Bug记录&#xff1a;在我写需求的时候&#xff0c;产品说上个包有崩溃&#xff0c;于是我就控制台 git checkout切分支&#xff0c;结果报错Please move or remove them before you switch branches.下面是被改动的文件&#xff0c;因为是项目build的时候产生的临时文件&#x…