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

设计模式(Design Patterns)

设计模式(Design Patterns) 是软件工程中解决常见设计问题可复用、最佳实践方案。它们不是现成的代码,而是经过验证的设计思想模板,帮助开发者构建灵活、可维护、可扩展的软件系统。


设计模式的核心价值

  1. 复用经验:避免重复“造轮子”,直接使用行业沉淀的成熟解决方案。
  2. 标准化沟通:如“用单例模式实现”,开发者立刻理解设计意图。
  3. 解耦代码:降低模块间的依赖性,提升系统灵活性。
  4. 提高可维护性:代码结构清晰,易于修改和扩展。

设计模式的分类(23种经典模式)

根据目的可分为三类:

1. 创建型模式(Creational)

解决对象创建问题,隔离实例化过程。

  • 单例(Singleton):确保一个类仅有一个实例(如全局配置对象)。
  • 工厂方法(Factory Method):让子类决定创建哪种对象。
  • 抽象工厂(Abstract Factory):创建相关对象的家族(如不同风格的UI组件)。
  • 建造者(Builder):分步构造复杂对象(如拼装电脑)。
  • 原型(Prototype):通过克隆现有对象创建新对象。
2. 结构型模式(Structural)

解决类与对象组合问题,构建灵活结构。

  • 适配器(Adapter):让不兼容的接口协同工作(如转接头)。
  • 装饰器(Decorator):动态添加功能(如给咖啡加糖)。
  • 代理(Proxy):控制对象访问(如远程代理、缓存代理)。
  • 外观(Facade):简化复杂子系统的接口(如一键关闭所有设备)。
  • 桥接(Bridge):分离抽象与实现,使两者独立变化。
  • 组合(Composite):统一处理树形结构(如文件系统)。
  • 享元(Flyweight):共享细粒度对象,减少内存占用(如字符池)。
3. 行为型模式(Behavioral)

解决对象间职责分配与通信问题。

  • 观察者(Observer):一对多的状态通知(如事件监听)。
  • 策略(Strategy):封装算法,使其可互换(如支付方式)。
  • 命令(Command):将请求封装为对象(如撤销/重做操作)。
  • 状态(State):让对象在不同状态下行为不同(如电梯运行状态)。
  • 模板方法(Template Method):定义算法骨架,子类重写步骤。
  • 迭代器(Iterator):提供遍历集合的统一接口。
  • 责任链(Chain of Responsibility):让多个对象依次处理请求(如审批流程)。

示例:单例模式(Singleton)

场景:全局只需一个实例(如数据库连接池)。

public class DatabasePool {// 1. 私有静态实例private static DatabasePool instance;// 2. 私有构造方法(禁止外部new)private DatabasePool() {}// 3. 全局访问点public static synchronized DatabasePool getInstance() {if (instance == null) {instance = new DatabasePool();}return instance;}
}
// 使用:DatabasePool pool = DatabasePool.getInstance();

学习设计模式的关键原则

  1. 理解场景:模式解决什么问题?何时用?何时不用?
  2. 遵循SOLID原则
    • 单一职责(一个类只做一件事)
    • 开闭原则(对扩展开放,对修改关闭)
    • 里氏替换(子类可替换父类)
    • 接口隔离(接口尽量小而专)
    • 依赖倒置(依赖抽象而非具体实现)
  3. 避免滥用:强行套用模式可能使代码更复杂。

推荐资源

  • 书籍:《设计模式:可复用面向对象软件的基础》(GoF经典)
  • 图解:Refactoring.Guru 网站(链接)
  • 实践:在开源项目(如Spring、JDK)中观察模式应用。

设计模式是“术”,设计原则(如SOLID)才是“道”。掌握本质才能灵活运用!

http://www.xdnf.cn/news/17967.html

相关文章:

  • C++:stl-> list的模拟实现
  • 条件变量的基本介绍与有界缓冲区问题
  • 异步开发:协程、线程、Unitask
  • C语言——深入理解指针(四)
  • 获取农历日期
  • Jeecg后端经验汇总
  • strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本
  • 如何避免网盘中资源被和谐?
  • LeetCode算法日记 - Day 12: 寻找旋转排序数组中的最小值、点名
  • Erlang notes[2]
  • Vue 侦听器(watch 与 watchEffect)全解析1
  • 图解软件知识库体系
  • GaussDB 常用数值类型
  • 分布式锁:从理论到实战的深度指南
  • python自学笔记8 二维和三维可视化
  • 深入解析Prompt缓存机制:原理、优化与实践经验
  • 云原生俱乐部-杂谈1
  • CVE-2014-6271(bash破壳漏洞 )
  • Android数据缓存目录context.getCacheDir与Environment.getExternalStorageDirectory
  • Git 中切换到指定 tag
  • 会议系统进程池管理:初始化、通信与状态同步详解
  • Fiddler抓包
  • 【FreeRTOS】刨根问底4: 优先级反转是啥?咋解决?
  • 为什么Integer缓存-128 ~ 127
  • 学习设计模式《二十二》——职责链模式
  • 搭建 Docker 私有仓库
  • springboot项目不同平台项目通过http接口AES加密传输
  • UE5配置MRQ编解码器输出MP4视频
  • 机器人“ChatGPT 时刻”倒计时
  • 电池模组奇异值分解降阶模型