23种设计模式使用场景分析

概述

网上关于设计模式的文章特别多,就不赘述了,我认为在敲代码的时候知道根据当前代码结构选择合适的设计模式是最重要的,知道了要使用哪个设计模式,就可以上网随便百度一下,

简述

对23中设计模式的分类

创建型模式

这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

工厂模式

  • 使用场景

一个调用者要创建一个对象,但是不太确定这个对象的类型,或者说该对象类型有多个想日后方便扩展,比如数据库访问,当用户不知道最后系统采用哪一类数据库,以及数据库可能有变化时,此时可以使用工厂模式,当使用oracle数据库时,需要oracle数据库子类实现接口,当想要增加mysql数据库时,再增加mysql数据库子类实现接口,

  • 核心角色

抽象产品:定义了产品的共同接口或抽象类,它可以是具体产品类的父类或者接口,规定了产品对象的共同方法,

具体产品:实现了抽象产品接口,定义了具体产品的具体行为,

具体工厂:声明了创建产品的具体方法,多个产品可以在工厂中创建多个方法,它可以有多个方便用户创建不同类型的产品,比如创建水果类型的方法和创建不同植物类型的方法,

  • 缺点

每增加一种类型的产品时,都需要增加一个具体产品类和具体子类工厂,使得系统中的类个数成倍增加,另外增加了系统具体类之间的依赖,

抽象工厂模式

实际上是在工厂模式的基础上横向增加了一个产品类型维度,比如水果抽象工厂+水果类型,植物抽象工厂+植物类型,增加了多个产品类型后,在多种产品簇上层抽象了另外一个工厂,

  • 使用场景

系统的产品有多个产品簇,举例:在一个房间里有植物类和水果类,当同时消耗系统里面的植物和水果时,因为产品簇不一样,需要在不同产品簇的工厂方法顶层再抽象一个抽象类,在这个顶层抽象工厂聚合多个同类产品,当一个产品簇中的多个对象被设计成一起工作时,他能保证客户端始终只是用同一个产品簇中的对象,(不同产品簇对象可以有联系)

  • 核心角色

抽象产品:定义了一组产品对象的共同接口或抽象类,描述了产品对象的公共方法,

具体产品:实现了抽象产品接口,定义了具体产品的具体行为,

抽象工厂:声明了一组用于创建产品簇对象的方法,每个方法对应一种产品簇类型,抽象工厂可以是接口或者抽象类,

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

  • 缺点

产品簇扩展困难,需要增加一个系列的产品类,还要增加该产品类的工厂类,以及在顶层抽象工厂类中增加抽象方法,

单例模式

  • 使用场景

  • 核心角色

  • 缺点

建造者模式

  • 使用场景

  • 核心角色

  • 缺点

原型模式

  • 使用场景

  • 核心角色

  • 缺点

结构型模式

适配器模式

  • 使用场景

  • 核心角色

  • 缺点

桥接模式

  • 使用场景

  • 核心角色

  • 缺点

过滤器模式

  • 使用场景

  • 核心角色

  • 缺点

组合模式

  • 使用场景

  • 核心角色

  • 缺点

装饰器模式

  • 使用场景

  • 核心角色

  • 缺点

外观模式

  • 使用场景

  • 核心角色

  • 缺点

享元模式

  • 使用场景

  • 核心角色

  • 缺点

代理模式

  • 使用场景

  • 核心角色

  • 缺点

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

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

相关文章

日常学习之:vue + django + docker + heroku 对后端项目 / 前后端整体项目进行部署

文章目录 使用 docker 在 heroku 上单独部署 vue 前端使用 docker 在 heroku 上单独部署 django 后端创建 heroku 项目构建 Dockerfile设置 settings.pydatabase静态文件管理安全设置applicaiton & 中间件配置 设置 requirements.txtheroku container 部署应用 前后端分别部…

(自用)learnOpenGL学习总结-高级OpenGL-模板测试

模板测试 模板测试简单来说就是一个mask,根据你的mask来保留或者丢弃片段。 那么可以用来显示什么功能呢?剪切,镂空、透明度等操作。 和深度缓冲的关系是: 先片段着色器,然后进入深度测试,最后加入模板测…

2023年中国工控自动化市场现状及竞争分析,美日占主角,国产品牌初崭头角

工控自动化是一种运用控制理论、仪器仪表理论、计算机和信息技术,对工业生产过程实现检测、控制、优化、调度、管理和决策,达到增加产量、提高质量、降低消耗、确保安全等目的综合性技术。产品应用领域广泛,可分为OEM型行业和项目型行业。 近…

2024年最新 MySQL的下载、安装、启动与停止

一、MySQL的下载 MySQL最常用的2个版本: 社区版:免费开源,自由下载,不提供官方技术支持,大多数普通用户选择这个即可。企业版:需要付费,不能在线下载,可以使用30天,提供…

aio-max-nr达到上限导致数据库性能问题

问题说明: rac数据库节点一表面上看由于归档等待事件导致业务性能问题。 问题分析过程: 查看awr报告top事件,等待事件主要为归档切换问题: 查看事件,归档等待达到20多分钟 检查节点alert日志发现,最…

Linux第37步_解决“Boot interface 6 not supported”之问题

在使用USB OTG将“自己移植的固件”烧写到eMMC中时,串口会输出“Boot interface 6 not supported”,发现很多人踩坑,我也一样。 见下图: 解决办法: 1、打开终端 输入“ls回车”,列出当前目录下所有的文件…

从centos镜像上创建具备SSH链接的Dockerfile

1. 创建目录,名字随意 mkdir dockfile cd dockfile 2. 创建名字为Dockerfile的文件 touch Dockerfile 3. 编辑内容如下 FROM centos MAINTAINER liufeng "liufgeoscene.cn"RUN /bin/echo root:123456|chpasswd RUN useradd test RUN /…

SpringCloud-高级篇(十六)

前面学习了Lua的语法,就可以在nginx去做编程,去实现nginx类里面的业务,查询Redis,查询tomcat等 ,业务逻辑的编写依赖于其他组件,这些组件会用到OpenResty的工具去实现 (1)安装OpenRe…

C++(16)——vector的模拟实现

前面的文章中,给出了对于的模拟实现,本篇文章将给出关于的模拟实现。 目录 1.基本框架: 2. 返回值与迭代器: 2.1 返回值capacity与size: 2.2 两种迭代器iterator和const_iterator: 3. 扩容与push_back与pop_back&#xff1a…

后端学习:数据库MySQL学习

数据库简介 数据库:英文为 DataBase,简称DB,它是存储和管理数据的仓库。   接下来,我们来学习Mysql的数据模型,数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前,需要先了解一个概念&#xf…

Java运算符优先级

以下是一份Java运算符的优先级、类别和结合性的表格总结: 由于| 与制表符有冲突,所以用大写字母I代替| 优先级类别运算符结合性1括号( )从左向右2一元运算符!、~、、–从右向左3乘法、除法、取模*、/、%从左向右4加法、减法、-从左向右5位左移、位右移…

log4j2 配置入门介绍

配置 将日志请求插入到应用程序代码中需要进行大量的计划和工作。 观察表明,大约4%的代码专门用于日志记录。因此,即使是中等规模的应用程序也会在其代码中嵌入数千条日志记录语句。 考虑到它们的数量,必须管理这些日志语句,而…

【QT+QGIS跨平台编译】之十三:【giflib+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、giflib介绍二、文件下载三、文件分析四、pro文件五、编译实践一、giflib介绍 GIFlib(又称为Libgif)是一个开源的C语言库,用于处理GIF图像格式。它提供了一组函数和工具,使得开发者可以读取、写入和操作GIF图像文件。 GIFlib支持GIF87a和GIF89a两种版本的GIF格…

倒计时71天

1.D-小红整数操作_牛客周赛 Round 30 (nowcoder.com) /****** __----~~~~~~~~~~~------___* . . ~~//...... __--~ ~~* -. \_|// |||\\…

【项目管理】CMMI-管理性能与度量

管理性能与度量 (Managing Performance and Measurement, MPM)的目的在于开发和维持度量能力来管理开发过程性能,以实现公司业务目标,更直接来说,将管理和改进工作集中在成本、进度表和质量性能上,最大限度地提高业务投资回报。 1…

军事博弈智能的核心是“诡”与“诈”

军事博弈智能的核心是“诡”与“诈”,意味着在军事博弈中,智能系统需要具备隐蔽、变化、欺骗和误导的能力,以达到取胜的目的。 首先,“诡”指的是智能系统需要具备隐蔽性和伪装变化能力,使对手难以获得准确的情报和判断…

JavaScript之ES6常用语法

文章目录 JavaScript之ES6常用语法1. 基本用法1.变量声明var、let、const1. 作用域2. 变量提升3. 声明次数4. const常量 2.模板字符串3.函数3**函数默认参数** 4.拓展的对象功能5.更方便的数据访问--解构6.Spread Operator 展开运算符7.import 和 export8. Promise9.Generators…

linux(进程概念)

目录 前言: 正文 冯诺依曼体系结构 操作系统 (Operator System) 概念 目的 定位 如何理解“管理” 进程组织 基本概念 内核数据结构 代码和数据 查看进程 ps指令 top指令 父子进程 fork创建进程 小结: 前…

【Redis】Redis有哪些适合的场景

🍎个人博客:个人主页 🏆个人专栏:Redis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 (1)会话缓存(Session Cache) (2)全页缓存(FPC…

深入理解TCP网络协议(1)

目录 1.TCP协议的段格式 2.TCP原理 2.1确认应答 2.2超时重传 3.三次握手(重点) 4.四次挥手 1.TCP协议的段格式 我们先来观察一下TCP协议的段格式图解: 源/目的端口号:标识数据从哪个进程来,到哪个进程去 32位序号/32位确认号:TCP会话的每一端都包含一个32位&#xff08…