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

设计模式(Design Pattern)

概念

       设计模式(Design Pattern)是针对软件设计中重复出现的问题,总结出的一套经过验证的解决方案,

       它描述了在特定场景下如何组织代码结构、类与对象的关系,帮助开发者编写更高效、可维护、可扩展的代码。

分类

《设计模式:可复用面向对象软件的基础》根据用途,把设计模式分为三大类,共23种经典模式

(1)创建型模式(5 种)

解决 “对象创建” 的问题,隐藏创建细节,使代码更灵活。

       单例模式:保证一个类只有一个实例(如全局配置对象)。

       工厂模式:通过工厂类统一创建对象,屏蔽具体实现(如不同数据库连接的创建)。

       抽象工厂模式:创建一系列相关或依赖的对象(如一套 UI 组件的不同主题实现)。

       建造者模式:分步构建复杂对象(如自定义电脑配置:CPU、内存、硬盘分步组装)。

       原型模式:通过复制现有对象创建新对象(如大对象的快速克隆)。

(2)结构型模式(7 种)

解决 “类或对象的组合” 问题,优化代码结构。

       适配器模式:使不兼容的接口可以一起工作(如旧系统接口适配新框架)。

       装饰器模式:动态给对象添加功能(如给文本编辑器增加 “加粗”“斜体” 功能)。

       代理模式:为对象提供代理(如远程代理、权限代理)。

       外观模式:为复杂系统提供简单接口(如智能家居的 “一键场景” 封装多个设备操作)。

       桥接模式:分离抽象与实现,使二者可独立变化(如跨平台 UI 框架:抽象 “按钮”,实现 “Windows 按钮”“Linux 按钮”)。

       组合模式:将对象组合成树形结构,统一处理单个对象和组合对象(如文件系统的 “文件” 和 “文件夹”)。

       享元模式:复用大量相似对象,节省资源(如游戏中重复出现的道具、粒子效果)。

(3)行为型模式(11 种)

解决 “对象之间的交互与职责分配” 问题,优化协作逻辑。

       策略模式:定义算法家族,动态切换(如电商的多种折扣计算方式)。

       模板方法模式:定义流程骨架,子类实现具体步骤(如做饭:固定 “备料→烹饪→装盘”,子类实现 “做川菜”“做粤菜”)。

       观察者模式:对象状态变化时,自动通知依赖它的对象(如公众号推送、事件监听)。

       迭代器模式:提供遍历集合的统一接口(如 Python 的for循环遍历列表、字典)。

       责任链模式:将请求传递给多个处理器,直到被处理(如审批流程:员工→经理→总监)。

       命令模式:将操作封装为对象,支持撤销、排队(如遥控器按钮控制家电)。

       备忘录模式:保存对象状态,以便恢复(如游戏存档、文档撤销功能)。

       状态模式:对象状态变化时,行为随之改变(如订单状态:待支付→已支付→已发货)。

       访问者模式:在不修改类的前提下,增加对类的新操作(如报表生成工具访问不同数据对象)。

       中介者模式:用中介者减少对象间的直接耦合(如聊天室的服务器转发消息)。

       解释器模式:定义语言语法的解释器(如正则表达式解析器、公式计算器)。

单例:

一个类只有一个实例,全局访问,节省内存

一般对象创建

class tools:msg="I am OK"def shout():print(msg)# 调用创建两个对象,需要消耗两块内存空间
obj_1 = tools()
obj_1.shout()obj_2 = tools()
obj_2.shout()

单例对象创建

class tools:msg="I am OK"def shout():print(msg)# 调用创建1个对象,需要消耗1块内存空间
tool=tools()obj_1 = tool
obj_1.shout()obj_2 = tool
obj_2.shout()

工厂:

不直接使用类创建对象,通过创建一个工厂函数调用类创建对象,统一创建对象入口,方便修改维护

class 类1:pass
class 类2:pass
class 类3:passdef 工厂函数名(目标类名):if 类1==目标类名:return 类1()elif 类2==目标类名:return 类2()else:return 类3()# 调用
工厂函数名(类1)

http://www.dtcms.com/a/323851.html

相关文章:

  • vue和react和uniapp的状态管理分别是什么,并且介绍和怎么使用
  • FreeRTOS 任务与中断函数:运行机制、关键区别与使用准则
  • 如何利用RabbitMQ延迟消息优化电商支付
  • MPLS特性之PHP(Penultimate Hop Popping)
  • Android的事件分发流程、Kotlin协程、4大组件、Handler机制、架构设计、性能优化、内存泄漏
  • 从神经网络语言模型(NNLM)到Word2Vec:自然语言处理中的词向量学习
  • NLP——TF-IDF算法
  • WebAssembly技术详解:从浏览器到云原生的高性能革命
  • 麒麟系统播放 pptx
  • Spring MVC 九大组件源码深度剖析(二):LocaleResolver - 国际化背后的调度者
  • 集成电路学习:什么是Parameter Server参数服务器
  • 【软件测试】BUG篇 — 详解
  • 从 `unittest` 到 `pytest`:探寻 Python 测试框架的优雅进化与社区选择*
  • Java 后端性能优化实战:从 SQL 到 JVM 调优
  • Spring 依赖注入、AOP代理
  • GC如何判断对象可以被回收?
  • 分享一个基于Python和Hadoop的的电信客户特征可视化分析平台 基于Spark平台的电信客服数据存储与处理系统源码
  • Django @login_required实现登陆认证
  • 十、Linux Shell脚本:流程控制语句
  • Hadoop MapReduce过程
  • K8s DaemonSet 详解
  • K8s四层负载均衡-service
  • NLP学习开始-02逻辑回归
  • DevOps:从GitLab .gitlab-ci.yml 配置文件到CI/CD
  • LeetCode - 搜索插入位置 / 排序链表
  • win11(RTX5060)下进行nanodetplus训练
  • Kafka消费者相关原理
  • 第4章 程序段的反复执行4 多重循环练习(题及答案)
  • Audio Flamingo
  • 网站升级https地址方法