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

小谈设计模式(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 {@Overridepublic void draw() {System.out.println("Inside Circle::draw() method.");}
}public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Inside Rectangle::draw() method.");}
}

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

public interface ShapeFactory {Shape createShape();
}

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

public class CircleFactory implements ShapeFactory {@Overridepublic Shape createShape() {return new Circle();}
}public class RectangleFactory implements ShapeFactory {@Overridepublic 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.rhkb.cn/news/148073.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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);//此时,服务器已经成功进入监听状态&…

ubuntu22.04 x11窗口环境手势控制

ubuntu22.04 x11窗口环境手势控制 ubuntu x11窗口环境的手势控制并不优秀,我们可以使用touchegg去代替 这个配置过程非常简单,并且可以很容易在一定范围内达到你想到的效果,类比mac的手势控制 关于安装 首先添加源,并安装 sud…

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

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

电脑通过串口助手和51单片机串口通讯

今天有时间把电脑和51单片机之间的串口通讯搞定了,电脑发送的串口数据,单片机能够正常接收并显示到oled屏幕上,特此记录一下,防止后面自己忘记了怎么搞得了。 先来两个图片看看结果吧! 下面是串口3.c的文件全部内容&a…

OpenGLES:绘制一个混色旋转的3D圆锥

效果展示: 本篇博文总共会实现两种混色旋转的3D圆锥: 一.圆锥解析 1.1 对圆锥的拆解 上一篇博文讲解了绘制圆柱体,这一篇讲解绘制一个彩色旋转的圆锥 在绘制圆柱体时提到过,关键点是先将圆柱进行拆解,便于创建出顶…

计算机网络(五):运输层

参考引用 计算机网络微课堂-湖科大教书匠计算机网络(第7版)-谢希仁 1. 运输层概述 之前所介绍的计算机网络体系结构中的物理层、数据链路层以及网络层它们共同解决了将主机通过异构网络互联起来所面临的问题,实现了主机到主机的通信&#xff…

Ubuntu安装samba服务器

为了window系统下能够像访问本地目录一样访问ubuntu系统下的目录,这里我通过安装samba服务器,将ubuntu系统的文件目录通过网络挂载的方式共享出来,以便在window下就能够对ubuntu系统的文件进行读写等访问操作,这里记录一下samba服…

ESLint自动修复代码规范错误

基于 vscode 插件 ESLint 高亮错误,并通过配置 自动 帮助我们修复错误 在设置中 settings.json添加这段代码就自动修复错误 // 当保存的时候,eslint自动帮我们修复错误 "editor.codeActionsOnSave": { "source.fixAll": true }, /…

如何使用 AI与人工智能的定义、研究价值、发展阶段

目录 一、什么是人工智能 二、人工智能的研究价值 三、人工智能的发展阶段 一、什么是人工智能 人工智能(Artificial Intelligence,简称AI)是一门研究如何使计算机能够模拟和执行人类智能活动的科学与技术。人工智能旨在开发智能代理&…

Kaggle - LLM Science Exam上:赛事概述、数据收集、BERT Baseline

文章目录 一、赛事概述1.1 OpenBookQA Dataset1.2 比赛背景1.3 评估方法和代码要求1.4 比赛数据集1.5 优秀notebook 二、BERT Baseline2.1 数据预处理2.2 定义data_collator2.3 加载模型,配置trainer并训练2.4 预测结果并提交2.5 相关优化 前言:国庆期间…

常见web信息泄露

一、源码(备份文件)泄露 1、git泄露 Git是一个开源的分布式版本控制系统,在执行git init初始化目录的时候,会在当前目录下自动创建一个.git目录,用来记录代码的变更记录等。发布代码的时候,如果没有把.git这个目录删除&#xff…

前后端通信到底是怎样一个过程

前后端通信是怎样 前言:Http协议 超文本传输协议 规定:每一次前后端通信,前端需要主动向后端发出请求,后端接收到前端的请求后,可以给出响应 1、Http报文 浏览器向服务器发送请求时,请求本身就是信息&…

玩转快速排序(C语言版)

W...Y的主页 😊 代码仓库分享 💕 🍔前言: 本篇文章,我们来讲解一下神秘的快速排序。对于快速排序我相信大家都已经有所耳闻,但是快速排序是有很多的版本的。我们这次的目的就是快排的所有内容搞懂&#…

什么是GraphQL?它与传统的REST API有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是GraphQL?⭐ 与传统的REST API 的不同⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣…

JavaScript处理点击事件

在介绍点击事件之前,先给它们讲一些概念 事件监听 在JavaScript中,可以使用事件监听(Event Listener)来响应和处理各种事件。事件监听器是一种能够捕捉特定事件并执行相应代码的机制。事件监听器允许您在特定事件发生时执行自定…

Eclipse MAT解析headp dump,total size小于file size

1. 问题描述 使用Eclipse MAT分析20GB的heap dump文件 最后解析出来dump size只有1GB 2. 原因:heap dump中包含许多unreachable objects Eclipse MAT的官方文档,《Basic Tutorial》章节,有对上图的Overview page做介绍 针对total size小…

Qt扩展-QCustomPlot 用户交互

QCustomPlot 用户交互 一、概述二、操作范围三、选择机制1. 控制Graph的可选择性和选择状态2. 所选对象的外观3. 多部分对象4. 对选择变化做出反应 四、用户交互信号 一、概述 QCustomPlot提供了多个内置的用户交互。它们大致可以分为 通过用鼠标拖动和滚动鼠标滚轮进行范围操…

typescript映射类型

ts映射类型简介 TypeScript中的映射类型(Mapped Type)是一种高级类型,它允许我们基于现有类型创建新的类型,同时对新类型的每个属性应用一个转换函数。通过使用映射类型,我们可以方便地对对象的属性进行批量操作&…

华为数通方向HCIP-DataCom H12-831题库(单选题:181-200)

第181题 以下关于OSPF的5类LSA中的转发地址(ForwardingAddress,FA) 的描述,正确的是哪一项? A、当FA地址为0.0.0.0时,收到该LSA的路由器认为到达目的网段的数据包应该发往对应的ABR,因此将到达ABR的下一跳地址作为这条外部路由的下一跳 B、当FA地址为0.0.0.0时,收到该LS…

C++算法 —— 动态规划(12)两道小题

文章目录 1、动规思路简介2、组合总和Ⅳ3、卡特兰数 背包问题需要读者先明白动态规划是什么,理解动规的思路,并不能给刚接触动规的人学习。所以最好是看了之前的动规博客,以及背包博客,或者你本人就已经懂得动规了。 1、动规思路简…