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


设计模式专栏: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.mfbz.cn/a/387681.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【漏洞扫描】网络空间安全工具—Goby 快速入门使用指南

下载地址 Goby(含1322个POC) v2.8.9 社区版 介绍 Goby是一款基于网络空间测绘技术的新一代网络安全工具,它通过给目标网络建立完整的资产知识库,进行网络安全事件应急与漏洞应急。 Goby可提供最全面的资产识别,目前…

串行通信的艺术:深入解析UART与奇偶校验

发送数据位是电流传输吗? 在UART(Universal Asynchronous Receiver/Transmitter)通信中,发送数据位不直接以电流的形式传输。而是通过改变电压水平或者光信号(在光纤通信中)来表示不同的数据位&#xff08…

C#利用接口实现选择不同的语种

目录 一、涉及到的知识点 1.接口定义 2.接口具有的特征 3.接口通过类继承来实现 4.有效使用接口进行组件编程 5.Encoding.GetBytes(String)方法 (1)检查给定字符串中是否包含中文字符 (2)编码和还原前后 6.Encoding.GetS…

[计算机网络]---网络编程套接字

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

数仓建模—数据网格

数据网格 随着数字化时代的到来,近几年数据领域的新技术概念不断涌现,无论是数据湖、湖仓一体、流批一体、存算一体、数据编织抑或数据网格,很多还爬上了Gartner曲线,其中数据网格备受关注,数据网格从字面意思来看挺抽象的,会劝退很多人,但当你深入去理解这个概念时,才…

数据存储以及内存

数据在内存中的存储是因不同的类型而不同的。 但首先我们需要知道的是,在C语言中,数据在内存中的存储是以变量的形式存储的。每个变量都有一个地址,指向内存中的特定位置。变量的值存储在这个地址对应的内存单元中。不同类型的变量在内存中占…

react【三】受控组件/高阶组件/portals/fragment/严格模式/动画

文章目录 1、受控组件1.1 认识受控组件1.2 checkout1.3 selected1.4 非受控组件 2、高阶组件2.1 认识高阶组件2.2 应用1-props增强的基本使用2.3 对象增强的应用场景-context共享2.4 应用2-鉴权2.5 应用3 – 生命周期劫持2.6、高阶组件的意义 3、Portals4、fragment5、StrictMo…

【无标题】Matlab之annotation函数——创建图形注释(箭头、椭圆、矩形)

应用1:创建文本箭头注释 创建一个简单线图并向图窗添加文本箭头。用归一化的图窗坐标指定文本箭头位置,起点为 (0.3,0.6),终点为 (0.5,0.5)。通过设置 String 属性指定文本说明。 figure plot(1:10) x [0.3 0.5]; y [0.6 0.5]; annotation…

Linux网络基础1

目录 计算机网络背景协议OSI七层模型TCP/IP五层(四层)模型网络传输基本流程以太网通信原理IP地址理解 计算机网络背景 到目前为止,我们之前所有的编程都是单机的,不是多机互联。以前计算机被发明的时候是为了军事用途&#xff0…

【C语言】常见字符串函数的功能与模拟实现

目录 1.strlen() 模拟实现strlen() 2.strcpy() 模拟实现strcpy() 3.strcat() 模拟实现strcat() 4.strcmp() 模拟实现strcmp() 5.strncpy() 模拟实现strncpy() 6.strncat() 模拟实现strncat() 7.strncmp() 模拟实现strncmp() 8.strstr() 模拟实现strstr() 9.str…

Midjourney绘图欣赏系列(一)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子,它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同,Midjourney 是自筹资金且闭源的,因此确切了解其幕后内容尚不…

Vulhub kali 环境安装教程

进入 root 权限 sudo su 更新软件 apt-get update 安装 HTTPS 协议和 CA 证书 apt-get install -y apt-transport-https ca-certificates 安装 docker apt install docker.io 查看 docker 是否安装完成 docker -v 安装 pip apt-get install python3-pip 安装 docker-compose do…

【python之美】减少人工成本之批量去除首行_3

批量去除首行内容 怎么创建多个文本并写入多行数据呢 上特产: import ospath "C:\\Users\\Administrator\\Desktop\\text_1\\" numb int(input("需要创建几个文件:")) a 1 for i in range(numb):f open(path text _ str(a)…

jmeter-问题四:json断言时,预期结果那里如何不写成固定值?

文章目录 json断言时,预期结果那里如何不写成固定值?定义用户参数,然后在json断言的expected value处引用使用csv数据,然后在json断言的expected value处引用 json断言时,预期结果那里如何不写成固定值? 定…

测试开发-2-概念篇

文章目录 衡量软件测试结果的依据—需求1.需求的概念2.从软件测试人员角度看需求3.为什么需求对软件测试人员如此重要4.如何才可以深入理解被测试软件的需求5.测试用例的概念6.软件错误(BUG)的概念7.开发模型和测试模型8.软件的生命周期9.瀑布模型&#…

Spring 用法学习总结(三)之 AOP

Spring学习 7 bean的生命周期8 AOP面向切面编程8.1 AOP相关术语8.2 AOP使用 7 bean的生命周期 bean的生命周期主要为bean实例化、bean属性赋值、bean初始化、销毁bean,其中在实例化和初始化前后都使用后置处理器方法,而InstantiationAwareBeanPostProce…

Linux之多线程

目录 一、进程与线程 1.1 进程的概念 1.2 线程的概念 1.3 线程的优点 1.4 线程的缺点 1.5 线程异常 1.6 线程用途 二、线程控制 2.1 POSIX线程库 2.2 创建一个新的线程 2.3 线程ID及进程地址空间布局 2.4 线程终止 2.5 线程等待 2.6 线程分离 一、进程与线程 在…

HDFS的超级用户

一. 解释原因 HDFS(Hadoop Distributed File System)和linux文件系统管理一样,也是存在权限控制的。 但是很不一样的是, 在Linux文件系统中,超级用户Superuser是root而在HDFS中,超级用户Superuser是启动了namenode的用户&#x…

4核16g配置咋样?还不错,阿里云4核16G服务器26元1个月

4核16g配置咋样?还不错,阿里云4核16G服务器26元1个月,阿里云4核16G服务器配置优惠价格ECS云服务器经济型e实例26元1个月、149元半年、79元3个月,4核16G通用算力u1服务器、通用型g7、通用型g8i、AMD通用型g8a、性能增强通用型g8ae、…

html从零开始6:关系选择器、css盒子模型、弹性盒子模型【搬代码】

关系选择器 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-width,…