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

news2024/11/28 14:39:48


设计模式专栏: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://www.coloradmin.cn/o/1450463.html

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

相关文章

【Java多线程】Thread类的基本用法

目录 Thread类 1、创建线程 1.1、继承 Thread,重写run 1.2、实现 Runnable,重写run 1.3、使用匿名内部类,继承 Thread,重写run 1.4、使用匿名内部类,实现 Runnable,重写run 1.5、使用 lambda 表达式…

问题:总离差平方和为变形观测值与变形观测值的平均值之差的平方和。() #微信#其他

问题:总离差平方和为变形观测值与变形观测值的平均值之差的平方和。() 是 否 参考答案如图所示

html的表格标签

html的表格标签 table标签:表示整个表格tr:表示表格的一行td:表示一个单元格th:表示表头单元格.会居中加粗thead:表格的头部区域 (注意和th区分,范围是比th要大的).tbody:表格得到主体区域. table包含tr , tr包含td或者th. 表格标签有一些属性,可以用于设置大小边…

ChatGPT高效提问—prompt实践(健康助手)

ChatGPT高效提问—prompt实践(健康助手) ​ 随着社会经济的发展,人们的生活条件不断改善,人们对身体健康也日益重现。让ChatGPT作为健康助手也是一件不错的事。开始之前,还是老样子,先设置角色。 ​ 输入…

Typora+PicGO+腾讯云COS做图床教程

文章目录 Typora+PicGO+腾讯云COS做图床教程一、为什么使用图床二、Typora、PicGO和腾讯云COS介绍三、下载Typora和PicGOTyporaPicGO 四、配置Typora、PicGO和腾讯云COS腾讯云COS配置PicGO配置Typora配置 Typora+PicGO+腾讯云COS做…

【MySQL】操作库 —— 表的操作 -- 详解

一、增加表 1、创建表 mysql> create database [if not exists] table_name ( -> field1 datatype, -> field2 datatype, -> field3 datatype -> ) character set 字符集 collate 校验规则 engine 存储引擎; 注意 :最后一行也可以写成&#x…

中国电子学会2023年12月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

2023-12 Scratch一级真题 分数:100 题数:37 测试时长:60min 一、单选题(共25题,共50分) 1.观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?(C)&#xf…

C语言操作符练习

练习开胃菜 曾经有一道面试题&#xff0c;要求不能创建临时变量&#xff08;第三个变量&#xff09;&#xff0c;实现两个数的交换。 这道题如果没有前半句的修饰&#xff0c;就只是简单的一道基础题。 法一&#xff1a; #include <stdio.h> int main() {int a 0;i…

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全&#xff08;Network Security&#xff09;指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

生成式AI相关知识记录

一、简述开发步骤 开发一个生成式AI模型通常涉及以下步骤&#xff1a; 1. **需求分析与目标设定**&#xff1a; - 确定应用领域和目标&#xff0c;例如文本生成、图像生成、音乐创作等。 - 分析应用场景的具体需求&#xff0c;包括输出质量、速度、多样性、可控性等因素…

Codeforces Round 926 (Div. 2)

Codeforces Round 926 (Div. 2) Codeforces Round 926 (Div. 2) A. Sasha and the Beautiful Array 题意&#xff1a;略。 思路&#xff1a;从小到大排序&#xff0c;取前后差和。 AC code&#xff1a; void solve() {int ans 0;cin >> n;for (int i 1; i < n…

云原生之容器编排-Docker Swarm

1. 前言 上一篇我们讲到Docker Compose可以定义和运行多容器应用程序&#xff0c;用一个YAML配置文件来声明式管理服务&#xff0c;在一台安装了Docker engine的Linux系统上可以很好的工作&#xff0c;但是现实中不可能只有一台Linux系统&#xff0c;一台Linux系统不可能有足够…

算法详解(力扣141——环形链表系列)

博主ID&#xff1a;代码小豪 文章目录 环形链表环形链表的性质分析快慢指针法指针的追及相遇问题 环形链表&#xff08;2&#xff09; 环形链表 先来看看环形链表的原题&#xff1a; 中间的部分叙述有点繁杂&#xff0c;简单来概括就是&#xff0c;假如有一个节点&#xff0c…

C语言:指针的基础详解

目录 1. 内存 2. 取地址& 3. 指针变量 4. 解引用 4.1 *解引用 4.2 []解引用 4.3 ->解引用 5. 指针变量的大小 5.1 结论 6. 指针运算 7. void* 指针 8. const修饰指针 8.1 const修饰变量 8.2 const修饰指针变量 8.3 结论 9. 野指针 9.1 为什么会出现野指…

【AIGC】Stable Diffusion的模型微调

为什么要做模型微调 模型微调可以在现有模型的基础上&#xff0c;让AI懂得如何更精确生成/生成特定的风格、概念、角色、姿势、对象。Stable Diffusion 模型的微调方法通常依赖于您要微调的具体任务和数据。 下面是一个通用的微调过程的概述&#xff1a; 准备数据集&#xf…

optuna,一个好用的Python机器学习自动化超参数优化库

🏷️个人主页:鼠鼠我捏,要死了捏的主页 🏷️付费专栏:Python专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 前言 超参数优化是机器学习中的重要问题,它涉及在训练模型时选择最优的超参数组合,以提高模型的性能和泛化能力。Optuna是一个用于自动化超参数优化的…

数据密集型应用系统设计

数据密集型应用系统设计 原文完整版PDF&#xff1a;https://pan.quark.cn/s/d5a34151fee9 这本书的作者是少有的从工业界干到学术界的牛人&#xff0c;知识面广得惊人&#xff0c;也善于举一反三&#xff0c;知识之间互相关联&#xff0c;比如有个地方把读路径比作programming …

springboot192中国陕西民俗网

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的中国陕西民俗网 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取…

2.15日总结

第一题&#xff1a;最小生成树 #include<bits/stdc.h> using namespace std; int n,m; //输入n个节点以及m条边 struct lu//结构体 {int start;//连接到第一个节点int end1;//第二个节点long long l;//输入图之间的距离 }a[2000005]; int f[100005]; long long sum;//最小…

【硬核】javascript轻松实现自动化批量取消某音用户关注功能

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起学习和进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&a…