当前位置: 首页 > news >正文

探索设计模式的魅力:创建型设计模式的比较与决策


设计模式专栏: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

  • 与简单工厂相比,当对象的创建逻辑较复杂或对象的类型较多时,每个具体产品的创建都有自己的逻辑时适用工厂方法模式。例如,不同类型的数据库连接工厂或不同风格的UI组件工厂。
  • 适用于系统中有多个具体产品类,并且它们的创建逻辑可能有所不同,但客户端只需要关心接口的场景。例如,不同类型的图形绘制对象创建。

 4. 抽象工厂:http://t.csdnimg.cn/X7iwq

  • 适用于有多种产品族,而系统只消费其中某一系列产品的场景。比如跨平台UI工具箱,需要根据不同操作系统生成不同UI控件。
  • 当需要创建一系列相互关联或依赖的对象时,并且这些对象家族中的对象具有相同的约束条件时,可以使用抽象工厂模式。例如,创建不同主题的皮肤或界面。

 5. 建造者模式:http://t.csdnimg.cn/zUj9V

  • 当需要创建的对象非常复杂,有多个组成部分且这些部分的构建顺序可能不同,也可能需要不同的构建过程时,建造者模式是合适的。例如创建一个复杂的文档或UI布局。
  • 当需要构建的对象具有复杂的内部结构,并且这些对象的构建过程与表示过程相互分离时,可以使用建造者模式。例如,构建具有多个可选配置的复杂对象,如电脑配置、房屋装修等。

 6. 原型模式:http://t.csdnimg.cn/mORjg

  • 适用于创建新对象成本较高时,通过复制现有对象并修改为所需状态更为有效时。如当需要复制或克隆复杂的配置对象。
  • 当需要频繁创建相似对象,并且创建对象的成本较高时,可以使用原型模式。例如,创建大量相似的图形对象、文档对象等。

1.2 关键要素与差异对比

模式关键要素差异
单例模式只有一个实例保证全局只有一个实例,提供全局访问点
简单工厂模式创建对象根据参数创建对象,但客户端需要知道具体类名
工厂方法模式抽象创建将创建逻辑抽象到子类中,客户端只需要关心接口
抽象工厂模式创建对象家族创建一系列相关或依赖对象,强调对象家族的约束条件
建造者模式复杂对象构建将构建过程与表示过程分离,支持多步骤构建
原型模式克隆对象通过复制现有对象来创建新对象,节省创建成本
模式名称实例唯一参数化实例化复杂对象构建对象族产品类层次多个构建步骤克隆
单例单一类别
简单工厂扁平结构
工厂方法分层结构
抽象工厂分层结构
建造者单一类别
原型单一类别
  • 实例唯一:模式是否确保一个类只有一个实例。
  • 参数化实例化:创建实例时是否允许传递参数,从而产生不同种类的对象。
  • 复杂对象构建:是否支持将复杂对象的创建分解成不同部分和步骤。
  • 对象族:是否支持一组相关的产品对象的系列。
  • 产品类层次:是否组织产品类的方式,扁平结构通常指每个类都是独立的,而分层结构则意着存在继承关系。
  • 多个构建步骤:创建对象是否包含一系列步骤。
  • 克隆:创建实例是否通过复制一个原型。

1.3 结构图

         

三、模式选择指南

    在实际的软件设计过程中,选择合适的创建型模式对于提高代码的可维护性、扩展性和灵活性至关重要。然而,面对多种创建型模式,如何选择最适合当前场景的模式可能会成为一项挑战。本部分将提供场景分析和决策流程图,以帮助读者在实际工作中做出恰当的选择。

3.1 场景分析

    在选择创建型模式时,首先要分析当前场景的特点和需求。以下是一些常见的场景及其对应的创建型模式:

 1. 当需要一个全局唯一的实例时:

  • 例如,配置管理、日志记录等场景,适合使用单例模式。这样可以确保整个系统中只有一个实例,避免重复创建和资源浪费。

 2. 当需要根据不同条件创建不同类型对象时:

  • 例如,根据用户输入或配置文件创建不同类型的数据库连接对象,适合使用简单工厂模式。简单工厂模式可以根据传入的参数创建并返回相应类型的对象。

 3. 当需要让子类决定创建何种对象时:

  • 例如,在设计图形绘制系统时,有多种不同类型的图形对象需要创建,适合使用工厂方法模式。工厂方法模式将对象的创建逻辑抽象到子类中,客户端只需要关心接口即可。

 4. 当需要创建一系列相互关联或依赖的对象时:

  • 例如,在设计主题皮肤或界面时,需要同时创建多个相互关联的对象,适合使用抽象工厂模式。抽象工厂模式可以创建并返回一系列相关或依赖的对象,而无需指定具体的类。

 5. 当需要构建复杂对象且构建过程与表示过程相互分离时:

  • 例如,在构建具有多个可选配置的复杂对象时,适合使用建造者模式。建造者模式可以将复杂对象的构建过程拆分为多个步骤,使得构建过程更加清晰和灵活。

 6. 当需要频繁创建相似对象且创建成本较高时:

  • 例如,在创建大量相似的图形对象或文档对象时,适合使用原型模式。原型模式可以通过复制现有对象来创建新对象,从而节省创建成本和时间。

3.2 决策流程图

    根据决策流程图,读者可以按照以下步骤进行选择:

  1. 确定是否需要全局唯一的实例:如果是,则选择单例模式;否则,继续下一步。
  2. 确定是否需要根据不同条件创建不同类型对象:如果是,则选择简单工厂模式;否则,继续下一步。
  3. 确定是否需要让子类决定创建何种对象:如果是,则选择工厂方法模式;否则,继续下一步。
  4. 确定是否需要创建一系列相互关联或依赖的对象:如果是,则选择抽象工厂模式;否则,继续下一步。
  5. 确定是否需要构建复杂对象且构建过程与表示过程相互分离:如果是,则选择建造者模式;否则,继续下一步。
  6. 确定是否需要频繁创建相似对象且创建成本较高:如果是,则选择原型模式;否则,可能需要考虑其他非创建型的设计模式或自定义解决方案。

    通过以上场景分析和决策流程图,信息读者可以更加清晰地了解各种创建型模式的适用场景和选择依据,从而在实际工作中做出恰当的选择。 

        

四、结语

    创建型设计模式在软件设计中扮演了至关重要的角色,它们为开发者提供了多样化的工具和方法,以灵活且优雅地创建对象。每种创建型设计模式都有其独特的优势和适用场景,正确使用它们可以提高代码的可维护性、扩展性和可重用性。

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的用法

顾名思义&#xff0c;toRef 就是将其转换为ref的一种实现。详细请看&#xff1a; 一、toRef 1.1 示例 <script langts setup name"toRefsAndtoRef"> // 引入reactive,toRef import { reactive, toRef } from vue // reactive包裹的数据即为响应式对象 let p…...

《数学建模》专栏导读

文章分类 相关概念入门快速建模相关混合整数线性规划&#xff08;MILP&#xff09;加速技巧数值问题探讨相关问题解决技巧 相关概念入门 文章相关概念离散优化模型的松弛模型线性松弛问题混合整数线性规划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 是一种用于层次结构查询的语法&#xff0c;它允许我们从指定的起始节点开始&#xff0c;递归查询与该节点相关联的所有子节点。 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)

链接&#xff1a;https://pan.baidu.com/s/1V0E9IHSoLbpiWJsncmFgdA?pwd1688 提取码&#xff1a;1688 SMP&#xff08;Symmetric Multi-Processing&#xff09;&#xff0c;对称多处理结构的简称&#xff0c;是指在一个计算机上汇集了一组处理器(多CPU),各CPU之间共享内存子系…...

html5播放 m3u8

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

微信小程序按需注入和用时注入

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

iPhone 16 组件泄露 揭示了新的相机设计

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

网络工程师学习笔记——IPV6

20世纪80年代&#xff0c;IETF&#xff08;Internet Engineering Task Force&#xff0c;因特网工程任务组&#xff09;发布RFC791&#xff0c;即IPv4协议&#xff0c;标志IPv4正式标准化。在此后的几十年间&#xff0c;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提交代码&#xff0c;出现 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保护

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

HTML板块左右排列布局——左侧 DIV 固定宽度,右侧 DIV 自适应宽度,填充满剩余页面

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

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...