探索设计模式的魅力:创建型设计模式的比较与决策
设计模式专栏:http://t.csdnimg.cn/U54zu
目录
一、设计模式概览
1.1 创建型模式
二、比较创建型设计模式
1.1 适用场景典型用例
1.2 关键要素与差异对比
1.3 结构图
三、模式选择指南
3.1 场景分析
3.2 决策流程图
四、结语
4.1 优势
4.2 考量因素
一、设计模式概览
在软件工程中,设计模式是一套经过精心挑选的通用、可重复使用的解决特定设计问题的模板。它们是在多年软件开发实践中总结出来的最佳实践的集合,用于解决面向对象设计中常见的问题。设计模式可以加速软件开发过程,提高开发效率并促进团队之间的沟通。
设计模式分类通常分为三大类:
1. 创建型模式 (Creational Patterns) 2. 结构型模式 (Structural Patterns) 3. 行为型模式 (Behavioral Patterns) |
1.1 创建型模式
创建型设计模式关注对象创建的机制,尤其是当一个系统需要独立于其构成的类的实例化方式时。创建型模式的核心思想是将对象的创建和使用分离,以提供更大的系统灵活性。这类模式通常在涉及以下场景时会特别有用:
1. 当系统需要独立于它的产品的创建、组合和表示时。 2. 当需要封装一个类的实例化过程时。 3. 当提供对象创建的多个变体,但不想暴露创建逻辑的细节时。 |
创建型模式不仅可以隐藏这些实例化细节,还能通过定义创建接口将、系统中的对象创建与系统的其他部分解耦。这为改变系统内或系统间的对象创建过程提供了灵活性,可以改进代码的模块性、可扩展性和维护性。
常见的创建型模式包括单例模式(Singleton)、工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)和原型模式(Prototype)。每种模式解决了特定的问题,但它们的共同之处在于使得系统不必关心对象具体如何被创建、组成和表示。
在如今快速变化的软件设计领域,理解和运用创建型模式越来越成为了软件架构师和开发人员的基础技能。通过使用这些模式,开发人员可以更加集中精力在业务逻辑上,而不必过分关注对象创建的复杂性,从而加快开发进度并降低后期的维护成本。
在下一部分中,我们将深入探讨各种创建型模式,了解它们是如何工作的,以及它们在实际应用中如何能够为我们带来架构上的好处。
二、比较创建型设计模式
1.1 适用场景典型用例
1. 单例模式:http://t.csdnimg.cn/gRd4l
2. 简单工厂:http://t.csdnimg.cn/7mLkH
3. 工厂方法:http://t.csdnimg.cn/ldsMK
4. 抽象工厂:http://t.csdnimg.cn/X7iwq
5. 建造者模式:http://t.csdnimg.cn/zUj9V
6. 原型模式:http://t.csdnimg.cn/mORjg
|
1.2 关键要素与差异对比
模式 | 关键要素 | 差异 |
单例模式 | 只有一个实例 | 保证全局只有一个实例,提供全局访问点 |
简单工厂模式 | 创建对象 | 根据参数创建对象,但客户端需要知道具体类名 |
工厂方法模式 | 抽象创建 | 将创建逻辑抽象到子类中,客户端只需要关心接口 |
抽象工厂模式 | 创建对象家族 | 创建一系列相关或依赖对象,强调对象家族的约束条件 |
建造者模式 | 复杂对象构建 | 将构建过程与表示过程分离,支持多步骤构建 |
原型模式 | 克隆对象 | 通过复制现有对象来创建新对象,节省创建成本 |
模式名称 | 实例唯一 | 参数化实例化 | 复杂对象构建 | 对象族 | 产品类层次 | 多个构建步骤 | 克隆 |
单例 | 是 | 否 | 否 | 否 | 单一类别 | 否 | 否 |
简单工厂 | 否 | 是 | 否 | 否 | 扁平结构 | 否 | 否 |
工厂方法 | 否 | 是 | 否 | 否 | 分层结构 | 否 | 否 |
抽象工厂 | 否 | 否 | 否 | 是 | 分层结构 | 否 | 否 |
建造者 | 否 | 否 | 是 | 否 | 单一类别 | 是 | 否 |
原型 | 否 | 否 | 否 | 否 | 单一类别 | 否 | 是 |
- 实例唯一:模式是否确保一个类只有一个实例。
- 参数化实例化:创建实例时是否允许传递参数,从而产生不同种类的对象。
- 复杂对象构建:是否支持将复杂对象的创建分解成不同部分和步骤。
- 对象族:是否支持一组相关的产品对象的系列。
- 产品类层次:是否组织产品类的方式,扁平结构通常指每个类都是独立的,而分层结构则意着存在继承关系。
- 多个构建步骤:创建对象是否包含一系列步骤。
- 克隆:创建实例是否通过复制一个原型。
1.3 结构图
三、模式选择指南
在实际的软件设计过程中,选择合适的创建型模式对于提高代码的可维护性、扩展性和灵活性至关重要。然而,面对多种创建型模式,如何选择最适合当前场景的模式可能会成为一项挑战。本部分将提供场景分析和决策流程图,以帮助读者在实际工作中做出恰当的选择。
3.1 场景分析
在选择创建型模式时,首先要分析当前场景的特点和需求。以下是一些常见的场景及其对应的创建型模式:
1. 当需要一个全局唯一的实例时:
2. 当需要根据不同条件创建不同类型对象时:
3. 当需要让子类决定创建何种对象时:
4. 当需要创建一系列相互关联或依赖的对象时:
5. 当需要构建复杂对象且构建过程与表示过程相互分离时:
6. 当需要频繁创建相似对象且创建成本较高时:
|
3.2 决策流程图
根据决策流程图,读者可以按照以下步骤进行选择:
|
通过以上场景分析和决策流程图,信息读者可以更加清晰地了解各种创建型模式的适用场景和选择依据,从而在实际工作中做出恰当的选择。
四、结语
创建型设计模式在软件设计中扮演了至关重要的角色,它们为开发者提供了多样化的工具和方法,以灵活且优雅地创建对象。每种创建型设计模式都有其独特的优势和适用场景,正确使用它们可以提高代码的可维护性、扩展性和可重用性。
4.1 优势
1. 封装性:
2. 灵活性:
3. 代码重用:
4. 扩展性:
|
4.2 考量因素
1. 适用场景:
2. 性能开销:
3. 设计复杂度:
4. 学习成本:
|
总的来说,创建型设计模式是软件设计中的重要工具,它们能够帮助开发者构建更加健壮、灵活和可维护的软件系统。然而,在实际应用中,我们需要根据具体场景和需求来选择合适的模式,并权衡其带来的好处和可能的成本。通过不断学习和实践,我们可以更好地掌握这些模式,并将它们应用于实际项目中,以提高软件的质量和效率。
相关文章:

探索设计模式的魅力:创建型设计模式的比较与决策
设计模式专栏:http://t.csdnimg.cn/U54zu 目录 一、设计模式概览 1.1 创建型模式 二、比较创建型设计模式 1.1 适用场景典型用例 1.2 关键要素与差异对比 1.3 结构图 三、模式选择指南 3.1 场景分析 3.2 决策流程图 四、结语 4.1 优势 4.2 考量因素 一、…...

Linux之Shell
第 1 章 Shell 概述 1)Linux 提供的 Shell 解析器有 [zhaohadoop101 ~]$ cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh2)bash 和 sh 的关系 [zhaohadoop101 bin]$ ll | grep bash -rwxr-xr-x. 1 root root 941880…...

nginx upstream server主动健康检测模块添加https检测功能[完整版]
目录 1 缘起1.1 功能定义2. 实现后的效果2.1 配置文件2.2 运行效果3. 代码实现3.1 配置指令3.1.1 配置指令定义:3.1.2 配置指令结构体:3.1.3 配置指令源码定义:3.2 模块的初始化3.3 添加新的健康检测类型的定义3.4 握手完成后的处理3. 5 发送http请求3.6 接收http响应3.7 连…...

django中admin页面汉化
在Django中,将admin界面汉化为中文需要进行一些配置和翻译文件的添加。下面是一个基本的步骤指南,帮助你实现Django admin的汉化: 一:安装并配置Django: 如果你还没有安装Django,首先通过pip安装它: pip…...

prometheus基于consul的服务发现
文章目录 一、基础二、安装consul下载地址启动consul访问consul 三、编写服务发现文件nodes.json四、prometheus配置consul发现修改prometheus.yml重启Prometheus 参考 一、基础 二、安装consul 下载地址 https://developer.hashicorp.com/consul/install 启动consul mkdi…...

深度学习之pytorch实现线性回归
度学习之pytorch实现线性回归 pytorch用到的函数torch.nn.Linearn()函数torch.nn.MSELoss()函数torch.optim.SGD() 代码实现结果分析 pytorch用到的函数 torch.nn.Linearn()函数 torch.nn.Linear(in_features, # 输入的神经元个数out_features, # 输出神经元个数biasTrue # 是…...

Vue3快速上手(八) toRefs和toRef的用法
顾名思义,toRef 就是将其转换为ref的一种实现。详细请看: 一、toRef 1.1 示例 <script langts setup name"toRefsAndtoRef"> // 引入reactive,toRef import { reactive, toRef } from vue // reactive包裹的数据即为响应式对象 let p…...

《数学建模》专栏导读
文章分类 相关概念入门快速建模相关混合整数线性规划(MILP)加速技巧数值问题探讨相关问题解决技巧 相关概念入门 文章相关概念离散优化模型的松弛模型线性松弛问题混合整数线性规划MILP问题中增添约束的影响约束的影响 快速建模相关 文章求解器涉及步…...

App启动优化笔记 1
app大致的启动流程。有Launcher进程,system_server进程,zygote进程,APP进程。 Launcher进程:启动activity来启动应用 system_server进程:(ams是其中的一个binder):发送一个socket消息给Zygote。 zygote进程:收到消息后,fork新的进程,---》app进程启动 APP进程:…...

Spring Boot 笔记 027 添加文章分类
1.1.1 添加分类 <!-- 添加分类弹窗 --> <el-dialog v-model"dialogVisible" title"添加弹层" width"30%"><el-form :model"categoryModel" :rules"rules" label-width"100px" style"padding…...

【SQL】sql记录
1、start with star with 是一种用于层次结构查询的语法,它允许我们从指定的起始节点开始,递归查询与该节点相关联的所有子节点。 SELECT id, name, parent_id from test001 START WITH id 1 CONNECT BY PRIOR id parent_id 2、row_number() over pa…...

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第六天-ARM Linux编程之SMP系统 (物联技术666)
链接:https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码:1688 SMP(Symmetric Multi-Processing),对称多处理结构的简称,是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系…...

html5播放 m3u8
注意:m3u8地址要为网络地址,直接把代码复制为html直接在本地打开,可能不行,需要放在nginx或者apache或者其他的web服务器上运行。 <!DOCTYPE html> <html> <head><meta charsetutf-8 /><title>测试…...

微信小程序按需注入和用时注入
官网链接 按需注入 {"lazyCodeLoading": "requiredComponents" }注意事项 启用按需注入后,小程序仅注入当前访问页面所需的自定义组件和页面代码。未访问的页面、当前页面未声明的自定义组件不会被加载和初始化,对应代码文件将不…...

iPhone 16 组件泄露 揭示了新的相机设计
iPhone 16 的发布似乎已经等了很长一段时间,但下一个苹果旗舰系列可能会在短短 7 个月内与我们见面——而新的组件泄漏让我们对可能即将到来的重新设计有了一些了解。后置摄像头模块。 爆料者 Majin Bu(来自 MacRumors)获得的示意图显示&…...

网络工程师学习笔记——IPV6
20世纪80年代,IETF(Internet Engineering Task Force,因特网工程任务组)发布RFC791,即IPv4协议,标志IPv4正式标准化。在此后的几十年间,IPv4协议成为最主流的协议之一。无数人在IPv4的基础上开发…...

【零基础学习CAPL】——CAN报文的发送(LiveCounter——生命信号)
🙋♂️【零基础学习CAPL】系列💁♂️点击跳转 文章目录 1.概述2.面板创建3.系统变量创建4.CAPL实现5.效果5.1.0~15循环发送5.2.固定值发送6.全量脚本1.概述 本章主要介绍带有生命信号LiveCounter的报文发送脚本 一般报文可使用CANoe的IG模块直接发送,但存在循环冗余…...

git提交代码冲突
用idea2023中的git提交代码,出现 error: Your local changes to the following files would be overwritten by merge: ****/****/****/init.lua Please commit your changes or stash them before you merge. Aborting 出现这个错误可能是因为你的本地修改与远…...

树莓派:使用mdadm为重要数据做RAID 1保护
树莓派作为个人服务器可玩性还是有点的。说到服务器,在企业的生成环境中为了保护数据,基本上都会用到RAID技术。比如,服务器两块小容量但高性能的盘做个RAID-1按装操作系统,余下的大容量中性能磁盘做个RAID-5或者RAID-6存放数据。…...

HTML板块左右排列布局——左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面
我们可以借助CSS中的 float 属性来实现。 实例: 布局需求: 左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面。 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta http-e…...

红旗linux安装32bit依赖库
红旗linux安装32bit依赖库 红旗linux安装32bit依赖库 lib下载 红旗-7.3-lib-32.tar.gz 解压压缩包,根据如下进行操作 1.回退glibc(1)查看当前glibc版本[root192 ~]# rpm -qa | grep glibcglibc-common-2.17-157.axs7.1.x86_64glibc-headers-2.17-260.axs7.5.x86_…...

Stable Diffusion教程——使用TensorRT GPU加速提升Stable Diffusion出图速度
概述 Diffusion 模型在生成图像时最大的瓶颈是速度过慢的问题。为了解决这个问题,Stable Diffusion 采用了多种方式来加速图像生成,使得实时图像生成成为可能。最核心的加速是Stable Diffusion 使用了编码器将图像从原始的 3512512 大小转换为更小的 46…...

NFTScan | 02.12~02.18 NFT 市场热点汇总
欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2024.02.12~ 2024.02.18 NFT Hot News 01/ CryptoPunks 推出「Punk in Residence」孵化器计划 2 月 12 日,NFT 项目 CryptoPunks 宣布推出「Punk in Residence」孵化器计划&a…...

使用 apt 源安装 ROCm 6.0.x 在Ubuntu 22.04.01
从源码编译 rocSolver 本人只操作过单个rocm版本的情景,20240218 ubuntu 22.04.01 1,卸载原先的rocm https://docs.amd.com/en/docs-5.1.3/deploy/linux/os-native/uninstall.html # Uninstall single-version ROCm packages sudo apt autoremove ro…...

python函数的定义和调用
1. 函数的基本概念 在编程中,函数就像是一台机器,接受一些输入(参数),进行一些操作,然后产生输出(结果)。这让我们的代码更加模块化和易于理解。 函数是一段封装了一系列语句的代码…...

【JVM篇】什么是类加载器,有哪些常见的类加载器
文章目录 🍔什么是类加载器🛸有哪些常见的类加载器 🍔什么是类加载器 负责在类加载过程中,将字节码信息以流的方式获取并加载到内存当中 🛸有哪些常见的类加载器 启动类加载器 启动类加载器是有Hotspot虚拟机通过的类…...

STM32—DHT11温湿度传感器
文章目录 一.温湿度原理1.1 时序图 二.代码 一.温湿度原理 1.1 时序图 (1).下图一是DHT11总的时序图。 (2).图二对应图一的左边黑色部分,图三对应图一的绿色部分,图四的左部分图对应图一的红色部分,图四的右部分对应图一的黄色部分。 (3)…...

相机图像质量研究(31)常见问题总结:图像处理对成像的影响--图像差
系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结:光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结:光学结构对成…...

MySQL之select查询
华子目录 SQL简介SQL语句分类SQL语句的书写规范SQL注释单行注释多行注释 select语句简单的select语句select的算数运算select 要查询的信息 from 表名;查询表字段查询常量查询表达式查询函数 查询定义别名as安全等于<>去重distinct连接字段concat 模糊查询运算符比较运算…...

Android MMKV 接入+ 替换原生 SP + 原生 SP 数据迁移
背景:项目中一直使用的是原生 SP,众所周知,使用原生 SP 存在卡顿性能问题。公司的性能监控平台抓到不少原生 SP 导致的 ANR 问题: java.io.FileDescriptor.sync (FileDescriptor.java) android.os.FileUtils.sync (FileUtils.java:256) android.app.SharedPreferencesImpl.…...