什么是设计模式?为什么要使用设计模式?有什么好处?

什么是设计模式? 设计模式是一套被反复使用、多人知晓的、经过分类编写目的、代码代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码的可靠性。 阅读详情

设计模式(Design pattern):是针对设计问题的通用解决方案。

使用设计模式:可以把它应用到特定的应用中,用于解决相似的问题。

使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。

真正理解什么是设计模式,就是要透彻理解OO的四大要素:封装、继承、多态和关联。其中核心是封装的概念。


常用设计模式的一些优缺点

1 简单工厂模式(Static Factory Method)

适用场景

工厂类负责创建的对象比较少。
客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心。
由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

优点

工厂类是整个模式的关键。包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象。

通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的。明确了各自的职责和权利,有利于整个软件体系结构的优化。

缺点
  1. 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中,它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。
  2. 当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求。这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利。
  3. 这些缺点在工厂方法模式中得到了一定的克服。

2 策略模式(Strategy)

适用场景
  1. 多个类有不同的表现形式,每种表现形式可以独立成单独的算法。
  2. 需要再不同情况下使用不同的算法,以后算法可能还会增加。
  3. 对用户隐藏算法逻辑。
优点
  1. 每个算法单独封装,减少了算法和算法调用者的耦合。
  2. 合理使用继承有助于提取出算法中的公共部分。
  3. 简化了单元测试。
缺点
  1. 策略模式只适用于客户端知道所有的算法或行为的情况。
  2. 策略模式造成很多的策略类,每个具体策略类都会产生一个新类。不过可以使用享元模式来减少对象的数量。

3 装饰模式(Decorator)

适用场景
  1. 需要扩展一个类的功能,或给一个类添加附加职责。
  2. 需要动态的给一个对象添加功能,这些功能可以再动态的撤销。
  3. 需要增加由一些基本功能的排列组合而产生的非常大量的功能,从而使继承关系变的不现实。
  4. 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
优点
  1. Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。
  2. 通过使用不同的具体装饰类以及这些装饰类的排列组合,设计师可以创造出很多不同行为的组合。
缺点
  1. 这种比继承更加灵活机动的特性,也同时意味着更加多的复杂性。
  2. 装饰模式会导致设计中出现许多小类,如果过度使用,会使程序变得很复杂。
  3. 装饰模式是针对抽象组件(Component)类型编程。但是,如果你要针对具体组件编程时,就应该重新思考你的应用架构,以及装饰者是否合适。当然也可以改变Component接口,增加新的公开的行为,实现“半透明”的装饰者模式。在实际项目中要做出最佳选择。

4 代理模式(Proxy)

适用场景
  1. 远程代理,为一个对象在不同的地址空间提供局部代表,这样就可以隐藏一个对象存在于不同地址空间的事实。
  2. 虚拟代理,是根据需要创建开销很大的对象。通过它来存放实例化需要很长时间的真是对象。
  3. 安全代理,用来控制真实对象访问时的权限。
  4. 智能指引,是指当调用真是的对象时,代理处理另外的一些事情。
优点
  1. 职责清晰,真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
  2. 代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了中介的作用和保护了目标对象的作用。
  3. 高扩展性
缺点
  1. 在客户端和目标对象增加一个代理对象,会造成请求处理速度变慢。
  2. 增加了系统的复杂度。

5 工厂方法模式(Factory Method)

适用场景
  1. 工厂方法模式是new一个对象的替代品,所以在所有需要生成对象的地方都可以使用,但是需要慎重地考虑是否要增加一个工厂类进行管理,增加代码的复杂度。
  2. 需要灵活的、可扩展的框架时,可以考虑采用工厂方法模式。
  3. 工厂方法模式可以用在异构项目中,例如通过WebService与一个非Java的项目交互,虽然WebService号称是可以做到异构系统的同构化,但是在实际的开发中,还是会碰到很多问题,如类型问题、WSDL文件的支持问题,等等,从WSDL中产生的对象都认为是一个产品,然后由一个具体的工厂类进行管理,减少与外围系统的耦合。
  4. 可以使用在测试驱动开发的框架下,例如,测试一个类A,就需要把与类A有关联关系的类B也同时产生出来,我们可以使用工厂方法模式把类B虚拟出来,避免类A与类B的耦合。目前由于JMock和EasyMock的诞生,该使用场景已经弱化了,读者可以在遇到此种情况时直接考虑使用JMock或EasyMock。
优点
  1. 良好的封装性,代码结构清晰,减少模块间的耦合。
  2. 工厂方法模式的扩展性非常优秀。
  3. 屏蔽产品类。
  4. 工厂方法模式是典型的解耦框架。
缺点
  1. 使用者必须知道相应工厂的存在。
  2. 每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。

6 原型模式(Prototype)

适用场景
  1. 某些结构复杂的对象的创建工作;由于需求的变化,这些对象经常面临着剧烈的变化,但是他们却拥有比较稳定一致的接口。
  2. 一般在初始化的信息不发生变化的情况下,克隆是最好的方法。
优点
  1. 隐藏了对象创建的细节。
  2. 提高了性能。
  3. 不用重新初始化,动态获得对象运行时的状态。
缺点
  1. 适用性不是很广。
  2. 每一个类必须配备一个克隆方法。
  3. 配备克隆方法需要对类的功能进行通盘考虑,这对于全新的类不是很难,但对于已有的类不一定很容易,特别当一个类引用不支持串行化的间接对象,或者引用含有循环结构的时候。

7 模板方法模式(Template Method)

适用场景
  1. 适用于子类中有重复的代码,可以把重复代码提取出来,放到父类中。
优点
  1. 提高代码复用性。
  2. 帮助子类摆脱重复的不变行为。
缺点
  1. 考虑不全面统一出现问题。

好处

重用性

扩展性

灵活性

结构型设计模式:松耦合

避免了客户端环境与产品对象复杂的构造逻辑耦合

面试常问的设计模式之单例模式,深入理解单例模式 前言 初遇设计模式在上个寒假,当时把每个设计模式过了一遍,对设计模式有了一个最初级的了解。这个学期借了几本设计模式的书籍看,听了老师的设计模式课,对设计模式算是有个更进一步的认识。后面可能会不定期更新一下自己对于设计模式的理解。 每个设计模式看似很简单,实则想要在一个完整的系统中应用还是非常非常难的。然后我的水品也非常非常有限,代码量也不是很多,只能通过阅读书籍、思考别人的编码经验以及结合自己的编码过程中遇到的问题来总结。 怎么用->怎么用才好->怎么与其他模式结合使用,我想这是每个开发人员都. 阅读详情

相关推荐

ADC噪声参数博弈论:为何24位ADC的有效分辨率可能不如16位?

本文深入探讨了ADC噪声参数的核心矛盾,揭示了24位ADC有效分辨率可能不如16位ADC的根本原因。关键在于跳出单纯比较位数的误区,转而关注输入参考噪声这一绝对指标。文章通过分析参考电压对满量程范围和噪声模型的影响,阐述了动态范围与最小可测信号之间的取舍逻辑,为工程师提供了基于系统实际需求的ADC选型与噪声评估框架。

snow3的博客 706

设计模式概述以及 23种设计模式的介绍

文章目录设计模式概述(Design pattern):设计模式3大类设计模式的六大原则 设计模式概述(Design pattern): 设计模式:代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。 设计模式是一套被反复使用的、多数人知晓的、经过分类编...

云祁QI 4535

【AI+教育】别再让 Cursor 只当编辑器了!4 步解锁 Claude 官方技能!

本文介绍了在Windows环境下通过OpenSkills工具在Cursor中调用Claude AI技能的方法。主要内容包括:1)安装Node.js环境;2)全局安装OpenSkills工具;3)安装Claude官方技能库;4)通过AGENTS.md文件同步技能;5)在Cursor中直接调用技能完成Excel、PPT等任务。文章提供了详细的操作步骤和示例,帮助用户快速上手使用AI技能提升工作效率。

奶爸的编程之路,也就一周冷个三天 753

为什么要用设计模式?

1、设计模式是前人根据经验总结出来的,使用设计模式,就相当于是站在了前人的肩膀上。      2、设计模式使程序易读。熟悉设计模式的人应该能够很容易读懂运用设计模式编写的程序。      3、设计模式能使编写的程序具有良好的可扩展性,满足系统设计的开闭原则。比如策略模式,就是将不同的算法封装在子类中,在需要添加新的算法时,只需添加新的子类,实现规定的接口,即可在不改变现有系统源码的情况

C与嵌 2991

文献阅读:SAR像素偏移的性能改进An Improvement of the Performance of SAR Offset Tracking Approach

像素偏移追踪POT文献阅读

weixin_56301271的博客 342

uniapp自定义tabbar闪屏?3步搞定原生tabbar隐藏+自定义占位(附完整代码)

本文针对UniApp开发中自定义TabBar切换页面闪烁的痛点,提供了一套根治方案。通过隐藏原生TabBar并利用自定义组件进行视觉占位,巧妙结合原生切换的无闪烁优势与自定义设计的灵活性。文章详细解析了闪屏根源,并附上完整的page.json配置与代码实现,帮助开发者彻底解决此问题,提升小程序应用质感。

postgres8guard的博客 1530

Java设计模式:23种设计模式全面解析,墙都不扶就服你

命令模式:将命令请求封装为一个对象,使得可以用不同的请求来进行参数化。 迭代器模式:一种遍历访问聚合对象中各个元素的方法,不暴露该对象的内部结构。 观察者模式:对象间的一对多的依赖关系。 仲裁者模式:用一个中介对象来封装一系列的对象交互。 备忘录模式:在不破坏封装的前提下,保持对象的内部状态。 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器。 状态模式:允许一个对象在其对象内部状态改变时改变它的行为。 责任链模式:将请求的发送者..

m0_60747327的博客 1万+

借助Gemini 3 Pro高效解决课题申报中的五大核心痛点,亲测有效经验分享

之前给大家分享过关于AI辅助课题申报的相关的内容,涵盖了申报书部分撰写技巧,但没针对性拆解各位同仁在实际申报时遇到的卡壳的地方。比如选题范围拿捏不准,定的太大,根本没法落地完成;定的太小,研究价值则体现不了;写综述时,容易单纯罗列文献,缺乏批判性视角,没办法自然融入自己的判断,找不到研究缺口;研究方法部分,可能担心方法设计不够严谨,别人难以复现.....针对这些申报中的高频痛点,接下来七哥会从五个核心要点出发,借助Gemini 3 Pro高效解决这些痛点。

智能AI让学术科研更容易 701

设计模式--介绍

​ 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

turbolove的博客 2169

K8S搭建(centos)四、安装K8S

每个人都有惰性,但不断学习是好好生活的根本,共勉!

感谢阅读 2653

如何正确理解和获取S参数

差分四端口的S参数是由双端口S参数逐步演化而来,因此,在数学中,其各分量均可以从单端S参数推导而来,在实际的仿真和测试中,软件和测量设备也是通过获取单端S参数矩阵再进行运算得到混合S参数矩阵的,并非直接获取。

一只豌豆象的博客 5153

为什么要使用设计模式,以及使用设计模式的好处

它们是经过多年验证的成功实践,可以帮助开发人员更好地解决常见的设计和架构问题。提高团队协作: 设计模式提供了一种共享的设计和编码方法,这使得不同开发人员之间更容易理解和协作。提高代码的可重用性: 设计模式鼓励将常见的解决方案抽象出来,并将其封装在可重用的组件中。跨平台和跨语言: 许多设计模式是通用的,可以应用于不同的编程语言和开发环境。例如,享元模式可以减少内存使用,代理模式可以实现延迟加载,提高了程序的效率。降低风险: 设计模式是经过广泛验证的解决方案,因此使用它们可以减少错误和缺陷的出现。

luckywuxn的博客 1120

16、天文时间序列分类:基于人工神经网络的研究

本研究探讨了基于人工神经网络的天文时间序列分类方法,重点比较了MLP、LSTM和CNN等模型在BRITE和开普勒K2数据集上的表现。研究发现LSTM不适用于此类数据,而结合特征提取与PSO超参数优化的多层感知器(MLP)在开普勒K2数据上实现了98.55%的二分类准确率。通过精细的数据预处理和高置信度样本选择,显著提升了分类性能。研究成果为恒星变异性识别提供了高效工具,并对天文学与机器学习交叉领域具有重要参考价值。

pz8901234的博客 113

编程为什么要使用设计模式?使用设计模式的好处有哪些?

为什么要使用设计模式?使用设计模式的好处是啥?代码的追求的目标是啥? 为了编写出满足要求的代码,我们应该遵循什么样的原则?

weixin_43354152的博客 986

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

为什么要使用设计模式

然而,设计模式并非万能钥匙,应根据实际需求合理选择和使用,避免过度设计。通过灵活运用设计模式,可以构建出高质量、易维护的软件系统。

qq_57756904的博客 1067

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

为什么要用“设计模式”?(六大好处)

模式是一种问题的解决思路,已经适用于一个实践环境,并且可以适用于其他环境。设计模式通常是对于某一类软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的在于要重用软件开发经验。 主要作用为以下几种: (1)重用设计,重用设计比重用代码更有意义,它会自动带来代码的重用 (2)为设计提供共同的词汇,每个模式名就是一个设计词汇,其概念是的程序员间的交流更加方便。 (3)在开发文...

青衣煮茶 1万+

DesignPattern设计模式

本文主要介绍了设计模式相关内容。包括软件设计的SOLID原则,设计模式的分类,单例模式的思想与实现,工厂模式的思想与实现,建造者模式的思想与实现,代理模式的思想与实现,责任链模式的思想与实现等内容。供个人学习使用。

专注Java和MySQL领域知识分享 1883

论设计模式的重要性

当你用相同的代码来解决不同的问题时,你可以使用设计模式来重复使用原始代码,而不必每次都重新编写。1. 帮助理解和重构代码:设计模式描述了常见的代码组织和交互方式,因此可以帮助开发人员更好地理解复杂的代码结构并进行重构。3. 促进代码的可读性和可维护性:设计模式提供了清晰的代码组织方式,可以使代码易于阅读和理解,减少代码中的错误和重复性。2. 提高代码复用性:设计模式将普遍使用的代码结构和算法封装为独立的模块,可以用于其他项目或已有的代码库中。设计模式是通用的解决问题的方法论,可以提高软件开发的效率和质量。

记录 IT 领域经验与见解的博客 922

设计模式DesignPattern【1】

设计模式是对于反复出现的问题的解决方案,是关于如何解决某些问题的指南。它们不是可以插入应用程序中的类、包或库。相反,这些是关于如何在某些情况下解决某些问题的指导方针,是一种思想方面的东西。设计模式是软件设计中常见问题的典型解决方案。它们就像预制的蓝图,你可以对其进行自定义以解决代码中反复出现的设计问题。

2301_80272161的博客 1106

**模式的好处 (设计模式)

what’s up!?这样整理下发现更容易理解设计模式了学习嘛,就是拿着 rua横着rua 竖着rua 前面rua 后面rua 【’ _ ’ 】

m0_47879244的博客 892

设计模式实战教程:基于 youngyangyang04/DesignPattern 开源项目

设计模式实战教程:基于 youngyangyang04/DesignPattern 开源项目 本教程旨在全面介绍位于 GitHub 的设计模式开源项目。通过深入浅出的讲解,我们将涵盖项目的核心要素,提供快速上手指南,展示经典应用场景,以及探索其在技术生态中的位置。 1. 项目介绍 设计模式 是软件开发中的一套成熟解决方案,用于解决常见的设计问题并促进代码的可重用性、可维护性和扩展性。此开源项目 D...

gitblog_00568的博客 1058

开源项目 DesignPattern 使用教程

开源项目 DesignPattern 使用教程 1. 项目的目录结构及介绍 DesignPattern/ ├── src/ │ ├── creational/ │ │ ├── abstract_factory/ │ │ ├── builder/ │ │ ├── factory_method/ │ │ ├── prototype/ │ │ └── sing...

gitblog_00818的博客 368

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目

设计模式实践教程 - 基于 micooz/DesignPattern 开源项目 项目介绍 该项目由 Github 用户 micooz 维护,是针对软件开发中常见设计模式的实现集合。它旨在提供一个学习和理解各种设计模式的实战平台,涵盖了从单例模式到观察者模式等二十多种经典设计模式。通过此仓库,开发者可以深入学习每种模式的概念、应用场景及其实现细节,助力提升代码质量和可维护性。 项目快速启动 环境要求...

gitblog_00751的博客 819

DesignPattern 开源项目教程

DesignPattern 开源项目教程 1. 项目的目录结构及介绍 DesignPattern 项目的目录结构如下: DesignPattern/ ├── src/ │ ├── AbstractFactory/ │ ├── Adapter/ │ ├── Bridge/ │ ├── Builder/ │ ├── ChainOfResponsibility/ │ ├── Co...

gitblog_00406的博客 558
上一篇: ASP.NET 服务器控件的生命周期
下一篇: 在.NET中使用基类型(.NET 指南)
.NET跨平台
博客等级 码龄15年 6066粉丝 738原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值