GOF 23 种设计模式应用场景分析

写在前面

本文看下GOF 23 种设计模式应用场景,详细的还是通过文章给出参考链接学习下。

1:创建型

1.1:工厂设计模式

参考这篇文章 。

有几种产品需要创建,比如创建红苹果,青苹果,绿苹果,这些对象通过一个对象就可以。

1.2:抽象工厂设计模式

参考这篇文章 。

有几种产品需要创建,但是每种产品不能简单的通过一个对象来表示,比如联想主机,苹果主机,不管是哪种主机,都需要CPU对象,硬盘对象,风机对象等。

1.3:建造设计模式

参考这篇文章 。

一个对象的属性很多,且在不同的场景下对象创建时需要指定的的属性不同。可以有效避免设置大量的构造函数,或者是大量的调用read method,增加代码复杂度,降低可维护性。

1.4:原型模式

参考这篇文章 。

某个对象的创建成本比较高时,直接通过原型设计模式来克隆出一个,java中直接使用java.lang.Cloneable接口,之后调用clone方法即可(注意是浅拷贝)。

1.5:单例模式

参考这篇文章 。

当这个业务中只需要一个对象时。

2:结构型

2.1:适配器设计模式

参考这篇文章 。

当现有的接口无法直接满足客户端的需求时,比如入参不适配,返回值不适配等。

2.2:桥接设计模式

参考这篇文章 。

当一个产品的有多个变化的维度,并且每个维度到底有多少种变化是不确定的,如果是使用常规的继承方式的话可能会有非常非常多的子类,导致类过多而不好维护。

2.3:组合设计模式

参考这篇文章 。

当对象的结构是树形时,使用该设计模式,最典型的比如公司的层结构,家族族谱等。

2.4:装饰设计模式

参考这篇文章 。

当类现有的功能不足以满足客户端的需求,并且又不想使用继承的方式,或者是使用继承的方式不方便时,使用装饰设计模式。

2.5:门面设计模式

参考这篇文章 。

当某个类或者是某几个类的直接使用比较复杂,希望降低客户端的使用复杂度时,可以使用门面设计模式。

2.6:享元设计模式

参考这篇文章 。

当某个对象在程序中需要大量的使用,并且每个对象实例除了部分属性值不同外,其它的都相同,可以考虑使用享元设计模式,并且通过享元工厂创建享元对象还能实现对象缓存的功能。

2.7:代理设计模式

参考这篇文章 。

当一个对象因为安全问题,或者是对其的访问需要记录相关的日志,或者需要事务等时,可以考虑使用代理设计模式。

3:行为型设计模式

3.1:解释器设计模式

参考这篇文章 。
TODO

3.2:模板方法设计模式

参考这篇文章 。

当某个业务功能具有固定的操作步骤,但是不同的场景下有一个或者几个步骤要做的事情不同,其它的步骤都相同时,可以考虑使用模板方法设计模式。

3.3:责任链设计模式

参考这篇文章 。

当一个业务需要多个类中的一个或者是多个来完成时,可以考虑使用责任链设计模式。

3.4:命令设计模式

参考这篇文章 。

当一个类或者是几个类,具体的行为是通过外部的入参来决定时,可以考虑使用命令设计模式。

3.5:迭代器设计模式

参考这篇文章 。

当对象的内部有一组数据需要对外暴露,但又出于如下的原因不想让客户端直接访问内部的存储结构:

1:当内部存储结构发生变化时,客户端已有程序将不可用
2:客户端会破坏内部数据,造成不可控的bug

此时,可以使用迭代器设计模式,使用时可以直接使用jdk提供的java.lang.Iterable,和java.util.Iterator接口。

3.6:中介设计模式

参考这篇文章 。

TODO

3.7:备忘录设计模式

参考这篇文章 。

当需要记录对象在运行过程中的某个时刻的状态,并且在后续的某个时刻恢复到之前的某个时刻状态时,可以考虑使用备忘录设计模式。

3.8:观察者设计模式

参考这篇文章 。

当希望监听某个对象的状态,并在状态发生改变时做出响应,即典型的pub/sub,此时可以考虑使用观察者设计模式。

3.9:状态设计模式

参考这篇文章 。

当一个业务或者是一个对象内部某一个或者是几个状态发生变化,需要执行的操作不同时,可以考虑使用状态设计模式。

3.10:策略设计模式

参考这篇文章 。

当一个操作,根据外部入参的不同,可以通过不同的方式完成时,可以考虑使用策略设计模式,比如支付,可以使用微信支付,支付宝支付等。

3.11:访问者设计模式

参考这篇文章 。

当固定的几个元素(这里很关键,要固定的元素),在不同的业务场景下需要承担不同的职责不同时,可以考虑使用访问者设计模式,比如一个家庭有爸爸,妈妈,孩子,在如下不同的场景三者承担的职责不同:

做饭:爸爸职责:买菜孩子职责:洗菜妈妈职责:炒菜
孩子学习:爸爸职责:拿着鞋子站在孩子左边,孩子不好好学习了,打!!!妈妈职责:拿着棍子站在孩子右边,孩子不好好学习了,打!!!孩子职责:好好学习
外出旅游:爸爸职责:拿行李妈妈职责:美美的孩子职责:好好玩

写在后面

参考文章列表

面向对象设计原则和GOF23种设计模式 。

[永不磨灭的设计模式](https://shusheng007.top/2021/09/07/design-pattern/ 。

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

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

相关文章

【OpenCV】读入数字图像基础操作学习笔记

目录 读入数字图像: 窗口中显示图像: 将图像保存到本地: 窗口销毁(打开窗口就要销毁,以免影响后续十月): 等待输入: 读入数字图像: cv2.imread(所需读入的图像的完整路径(若图像在程序下的文件夹下也可直接输入图像名称),读入图像的形式) 读入图像的形式: cv2.IMREAD_CD…

8 君正视频采集的封装2

概述 在上一节中,我们进行了视频采集的需求分析,并封装了视频采集的接口类。在视频画面上,往往会叠加时间信息和各种文字信息,这就需要用到点阵字库。点阵字库一般有两种,一种是纯色字库,另一种是描边字库。纯色字库在视频背景色与文字颜色大致相同时,会导致文字很难辨认…

Pytorch个人学习记录总结 01

目录 函数-dir()、help() Dataset类 函数-dir()、help() dir() 函数,打开工具箱(例如PyTorch,进一步打开某一些分隔区) help() 函数,查看工具包中某一个工具函数的用法 (1) 查看torch工具包有哪些分割区 dir(torc…

19 数组静态初始化练习

语法: 数据类型[ ] 数组名称 {元素1,元素2,元素3}; public class Demo1 {public static void main(String[] args) {int[] arr {0,1,2,3};System.out.println(arr);System.out.println(arr[0]);System.out.println(arr[1]);System.out.pri…

SpringBoot中间件—ORM(Mybatis)框架实现

目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 源码地址(已开源):https://gitee.com/sizhaohe/mini-mybatis.git 跟着源码及下述UML图来理解上手会更快,拒绝浮躁,沉下心来搞 定义&#x…

【C++杂货铺】拷贝构造函数

📖定义 拷贝构造函数是构造函数的一个重载,它的本质还是构造函数,那就意味着,只有在创建对象的时候,编译器才会自动调用它,那他和普通的构造函数有什么区别呢? 拷贝构造函数,是创建…

【数学建模】为什么存在最优策略?

一、说明 在进行优化回归过程,首先要看看是否存在最优策略? 在有限马尔可夫决策过程 (MDP) 中,最优策略被定义为同时最大化所有状态值的策略。换句话说,如果存在最优策略,则最大化状态 s 值的策…

内存函数及其模拟实现

身体扛不住的时候,意志会带你杀出重围 文章目录 一、memcpy函数 函数介绍 模拟实现 二、memmove函数 函数介绍 模拟实现 三、memset函数 函数介绍 模拟实现 大家好,我是纪宁。这篇文章给大家介绍C语言中常见的内存处理函数。 一、memcpy函数 …

20.matlab数据分析极限(matlab程序)

1.简述 计算极限 MATLAB提供计算极限的limit函数。在其最基本的形式中,limit函数将表达式作为参数,并在独立变量为零时找到表达式的极限。 例如,要计算函数f(x)(x^3 5)/(x^4 7)的极限,因为x趋向于零。 syms xlimit((x^3 5)/…

day42-servlet下拉查询/单例模式

0目录 1.Servlet实现下拉查询(两表) 2.单例模式 1.实战 1.1 创建工程,准备环境... 1.2 接口 1.3 重写方法 1.4 servlet 1.5 list.jsp list.jsp详解 2.单例模式 2.1 饿汉模式:在程序加载时直接创建对象&#…

学习系统编程No.32【线程互斥实战】

引言: 北京时间:2023/7/19/15:22,昨天更新完博客,和舍友下了一会棋,快乐就是这么简单,哈哈哈!总体来说,摆烂程度得到一定的改善,想要达到以前的水准,需要一定…

UTM 4.3 发布:在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS

UTM 4.3 发布:在 macOS 上优雅的使用 QEMU 虚拟化 Windows、Linux 和 macOS 在 iOS 中虚拟化 Windows、Linux 和 Unix 请访问原文链接:https://sysin.org/blog/utm-4/,查看最新版。原创作品,转载请保留出处。 作者主页&#xf…

C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

题目: 有一个数字矩阵(二维数组), 矩阵的每行从左到右是递增的,矩阵从上到下是递增的, 请编写程序在这样的矩阵中查找某个数字是否存在, 要求:时间复杂度小于O(N)。 思路&#xff1…

《零基础入门学习Python》第057讲:论一只爬虫的自我修养5:正则表达式

如果你在课后有勤加练习,那么你对于字符串的查找应该是已经深恶痛绝了,你发现下载一个网页是很容易的,但是要在网页中查找到你需要的内容,那就是困难的,你发现字符串查找并没有你想象的那么简单,并不是说直…

(已解决)RuntimeError: Java gateway process exited before sending its port number

今天用Pycharm远程使用pysaprk解释器时,跑代码出现了这个错误: RuntimeError: Java gateway process exited before sending its port number 找了好多博客都没解决问题,有说重装spark的,有说本地配Java_home的,后面我…

leetcode 47. 全排列 II

2023.7.23 这道题是上一题全排列 的一个升级版。 唯一区别就是需要增加一个树层去重的操作&#xff0c;因为数组nums中允许有重复的元素了&#xff0c;而上一题没有重复元素。 下面看代码&#xff1a; class Solution { public:vector<vector<int>> ans;vector<…

如何评测一个大语言模型?

编者按&#xff1a;大型语言模型&#xff08;Large language models, LLMs&#xff09;因其在学术界和工业界展现出前所未有的性能而备受青睐。随着 LLMs 在研究和实际应用中被广泛使用&#xff0c;对其进行有效评测变得愈发重要。近期已有多篇论文围绕大模型的评测进行研究&am…

RocketMQ教程-(4)-领域模型-消费者分组ConsumerGroup

定义​ 消费者分组是 Apache RocketMQ 系统中承载多个消费行为一致的消费者的负载均衡分组。 和消费者不同&#xff0c;消费者分组并不是运行实体&#xff0c;而是一个逻辑资源。在 Apache RocketMQ 中&#xff0c;通过消费者分组内初始化多个消费者实现消费性能的水平扩展以…

【云原生】Docker网络及Cgroup资源控制

一、Docker网络 1.docker网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认网关。…

Rust之所有权

1、所有权的概念&#xff1a; 程序需要管理自己在运行时使用的计算机内部空间。Rust语言采用包含特定规则的所有权系统来管理内存&#xff0c;这套规则允许编译器在编译的过程中执行检查工作&#xff0c;而不会产生任何的运行时开销。 (1)、所有权规则&#xff1a; Rust中的…