小谈设计模式(16)—抽象工厂模式

news2024/11/17 9:31:29

小谈设计模式(16)—抽象工厂模式

  • 专栏介绍
    • 专栏地址
    • 专栏介绍
  • 抽象工厂模式
    • 结构
      • 抽象工厂(AbstractFactory)
      • 具体工厂(ConcreteFactory)
      • 抽象产品(AbstractProduct)
      • 具体产品(ConcreteProduct)
    • 适用情况
      • 1
      • 2
      • 3
    • Java程序实现
      • 首先,我们定义抽象产品接口:
      • 然后,我们定义具体产品类实现抽象产品接口:
      • 接下来,我们定义抽象工厂接口:
      • 然后,我们定义具体工厂类实现抽象工厂接口:
      • 最后,我们可以使用抽象工厂模式来创建具体产品对象:
      • 输出结果
      • 程序分析
    • 优缺点分析
      • 优点
        • 1
        • 2
        • 3
      • 缺点
        • 1
        • 2
        • 3

专栏介绍

专栏地址

link

专栏介绍

主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
在这里插入图片描述

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种封装一组相关或相互依赖对象创建的方式,而无需指定它们具体的类。
在这里插入图片描述

结构

抽象工厂(AbstractFactory)

声明一组创建产品对象的方法,每个方法对应一个具体产品类的创建。

具体工厂(ConcreteFactory)

实现抽象工厂接口,负责创建具体的产品对象。

抽象产品(AbstractProduct)

声明产品的共同接口,所有具体产品类都实现这个接口。

具体产品(ConcreteProduct)

实现抽象产品接口,定义具体产品的属性和行为。
在这里插入图片描述

适用情况

1

系统需要一组相关或相互依赖的产品对象,并希望统一创建它们。

2

系统不关心具体产品的创建过程,只关心产品的接口。

3

系统需要提供一个产品的类库,而不想暴露具体实现。
在这里插入图片描述

Java程序实现

首先,我们定义抽象产品接口:

public interface Shape {
    void draw();
}

然后,我们定义具体产品类实现抽象产品接口:

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

接下来,我们定义抽象工厂接口:

public interface ShapeFactory {
    Shape createShape();
}

然后,我们定义具体工厂类实现抽象工厂接口:

public class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Circle();
    }
}

public class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
        return new Rectangle();
    }
}

最后,我们可以使用抽象工厂模式来创建具体产品对象:

public class Main {
    public static void main(String[] args) {
        ShapeFactory circleFactory = new CircleFactory();
        ShapeFactory rectangleFactory = new RectangleFactory();

        Shape circle = circleFactory.createShape();
        circle.draw();

        Shape rectangle = rectangleFactory.createShape();
        rectangle.draw();
    }
}

输出结果

Inside Circle::draw() method.
Inside Rectangle::draw() method.

程序分析

我们定义了抽象产品接口 Shape 和具体产品类 Circle 和 Rectangle。然后,我们定义了抽象工厂接口 ShapeFactory 和具体工厂类 CircleFactory 和 RectangleFactory。最后,我们使用抽象工厂模式创建了具体产品对象 Circle 和 Rectangle。
在这里插入图片描述

优缺点分析

优点

1

提供了一种方便的方式来创建一组相关的产品对象,使得客户端无需关心具体产品的创建细节,只需要通过抽象接口来使用产品。

2

客户端与具体产品类解耦,增强了系统的灵活性和可扩展性。可以方便地替换具体工厂类和产品类,而不影响客户端的代码。

3

符合开闭原则,增加新的产品族和产品等级结构时,只需要添加对应的具体工厂类和产品类,而不需要修改已有的代码。
在这里插入图片描述

缺点

1

增加了系统的复杂度和理解难度。由于抽象工厂模式涉及多个抽象接口和具体实现类,需要理解和管理的类和接口较多,增加了代码的复杂性。

2

当需要增加新的产品等级结构时,需要修改抽象工厂接口和所有具体工厂类,破坏了开闭原则。

3

当产品族中的产品种类非常多时,会导致具体工厂类的数量增加,增加了系统的维护成本。

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

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

相关文章

解决每次重启ganache虚拟环境,十个账号秘钥都会改变问题

很多时候 我们启动一个 ganache 环境 然后 通过私钥 在 MetaMask 中 导入用户 但是 当我们因为 电脑要关机呀 或者 ETH 消耗没了呀 那我们就不得不重启一个ganache虚拟环境 然后 你在切一下网络 让它刷新一下 你就会发现 上一次导入的用户就没有了 这是因为 你每次 ganache…

Ae 效果:CC Power Pin

扭曲/CC Power Pin Distort/CC Power Pin CC Power Pin (CC 强力边角定位)与同组内的边角定位 Corner Pin效果非常类似,常用于对源图像的透视扭曲变形和四点跟踪合成。使用 CC Power Pin 会有更多的调整属性和更直观的操作。 ◆ ◆ ◆ 效果…

RobotFramework流程控制(最新版本)

文章目录 一 分支流程1. 关键字:Run Keyword If2. 关键字:IF/ELSE3. 嵌套IF/ELSE4. 关键字:Set Variable If 二 循环流程1. 普通FOR循环2. 嵌套FOR循环3. 退出循环4. 其它常用循环 一 分支流程 1. 关键字:Run Keyword If Run Key…

2023年10月4日

服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个服务器server new QTcpServer(this);//此时,服务器已经成功进入监听状态&…

Docker通过Dockerfile创建Redis、Nginx--详细过程

创建Nginx镜像 我们先创建一个目录,在目录里创建Dockerfile [rootdocker-3 ~]# mkdir mynginx [rootdocker-3 ~]# cd mynginx [rootdocker-3 ~]# vim Dockerfile Dockerfile的内容 FROM daocloud.io/library/centos:7 RUN buildDepsreadline-devel pcre-devel o…

Ventoy万能U盘安装系统,支持任何的操作系统安装

Ventoy万能U盘安装系统,支持任何的操作系统安装: Download . VentoyVentoy is an open source tool to create bootable USB drive for ISO files. With ventoy, you dont need to format the disk again and again, you just need to copy the iso fil…

【网络安全---ICMP报文分析】Wireshark教程----Wireshark 分析ICMP报文数据试验

一,试验环境搭建 1-1 试验环境示例图 1-2 环境准备 两台kali主机(虚拟机) kali2022 192.168.220.129/24 kali2022 192.168.220.3/27 1-2-1 网关配置: 编辑-------- 虚拟网路编辑器 更改设置进来以后 ,先选择N…

基于SSM的宿舍管理系统

基于SSM的学生宿舍管理系统的设计与实现,前后端分离 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 【主要功能】 系统主要分学生和管理员两个角色,功能有…

RSA攻击:模数分解

目录 一、模数分解总览 1.1直接分解法 1.2费马分解与Pollard_rho分解 1.3公约数分解 1.4其他模数分解 二、实战特训 2.1[黑盾杯 2020]Factor 2.2[GWCTF 2019]babyRSA 2.3[LitCTF 2023]yafu (中级) 2.4[RoarCTF 2019]RSA 2.5[CISCN 2022 西南]rsa 三、总结 一、模数分解总览 …

进程调度的时机,切换与过程以及方式

1.进程调度的时机 进程调度(低级调度〉,就是按照某种算法从就绪队列中选择一个进程为其分配处理机。 1.需要进行进程调度与切换的情况 1.当前运行的进程主动放弃处理机 进程正常终止运行过程中发生异常而终止进程主动请求阻塞(如等待l/O)…

(粗糙的笔记)动态规划

动态规划算法框架: 问题结构分析递推关系建立自底向上计算最优方案追踪 背包问题 输入: n n n个商品组成的集合 O O O,每个商品有两个属性 v i v_i vi​和 p i p_i pi​,分别表示体积和价格背包容量 C C C 输出: …

【C语言】函数的定义、传参与调用(二)

💗个人主页💗 ⭐个人专栏——C语言初步学习⭐ 💫点击关注🤩一起学习C语言💯💫 目录 导读: 1. 函数的嵌套调用 1.1 什么是嵌套调用 1.2 基础实现 1.3 调用流程解析 2. 函数的链式访问 2.1 …

算法通过村第十二关-字符串|青铜笔记|隐形的王者

文章目录 前言转换成小写字母字符串转换整数总结 前言 提示:为别人而活着,其实是最简单的一种活法。 --蔡崇达《命运》 字符串本身并不是一种数据结构,但是由于其本身的特殊性,额可以产生很多特殊的算法问题。另外,字符…

Java之并发工具类的详细解析

3. 并发工具类 3.1 并发工具类-Hashtable Hashtable出现的原因 : 在集合类中HashMap是比较常用的集合对象,但是HashMap是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性我们可以使用Hashtable,但是Hashtable的效率低下。 代码实现 …

数据源报表

1.新建报表 2.新建数据集 3.维护数据源 支持的数据库还是蛮多哈 4.选择数据源表 5.编写sql 编码:SQL数据集的标识 注:避免特殊字符和_名称:SQL数据集的名称是否集合:否为单数据;是为多数据列表,如果多条数据…

MapStruct初窥门径

一、介绍 MapStruct相比于BeanUtils性能更高&#xff0c;能够实现DO&#xff0c;DTO&#xff0c;VO之间的转换&#xff0c;达到解耦合的目的 二、使用前提 添加依赖 <dependency><groupId>org.mapstruct</groupId><artifactId>mapstruct</artifa…

第八章 Linux文件系统权限

目录 8.1 文件的一般权限 1.修改文件或目录的权限---chmod命令 2.对于文件和目录&#xff0c;r&#xff0c;w&#xff0c;x有不同的作用&#xff1a; 3.修改文件或目录的所属主和组---chown,chgrp 8.2 文件和目录的特殊权限 三种通过字符描述文件权限 8.3 ACL 权限 1.A…

基于Java的药店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

1500*A. Boredom(DP)

Problem - 455A - Codeforces Boredom - 洛谷 解析&#xff1a; 首先统计每个数的个数&#xff0c;并且统计出最大值mx。 问题转换为&#xff0c;从1-mx 中选择任意个数字&#xff0c;使其都不相邻&#xff0c;求最大的总和。 开始没有思路&#xff0c;以为直接选取偶数位和奇…

项目进展(七)-焊接ADS1285及其外围电路,学习芯片的SPI部分

一、焊接芯片及其外围电路 总体焊接过程没有出现什么大问题&#xff0c;也算顺利&#xff0c;下一步主要是根据SPI来编写代码&#xff0c;配置该芯片。 焊接之后的PCB如下(手工焊接&#xff0c;比较丑陋&#xff0c;哈哈哈哈) 之后测试了4.096V参考电压和晶振输出&#xff0c…