设计模式是软件设计中反复出现的解决方案的模板,用于解决特定问题并提高代码的可维护性、可扩展性和可复用性。23种经典设计模式可分为创建型、结构型和行为型三大类,以下是具体分类及模式概述:
一、创建型模式(5种)
关注对象的创建过程,解耦对象的实例化与使用,提高灵活性。
1.单例模式
- 定义:确保一个类只有一个实例,并提供全局访问点。
- 应用场景:配置管理、线程池、数据库连接池等。
- 实现方式:饿汉式、懒汉式、双重检查锁、静态内部类等。
2.抽象工厂模式
- 定义:创建一系列相关或依赖对象的家族,无需指定具体类。
- 应用场景:跨平台UI组件库、数据库访问层等。
- 优点:隔离具体类的生成,客户端与具体产品解耦。
3.工厂方法模式
- 定义:定义一个创建对象的接口,由子类决定实例化哪个类。
- 应用场景:JDBC连接数据库、日志记录器等。
- 优点:符合开闭原则,新增产品无需修改原有代码。
4.建造者模式
- 定义:分步骤构建复杂对象,允许相同的构建过程创建不同表示。
- 应用场景:SQL构建器、JSON解析器等。
- 优点:封装构建逻辑,便于扩展和复用。
5.原型模式
- 定义:通过复制现有对象创建新对象,避免重复初始化。
- 应用场景:对象创建成本高(如数据库连接)、缓存系统等。
- 实现方式:浅拷贝(Object.clone())或深拷贝(序列化/反序列化)。
二、结构型模式(7种)
关注类或对象的组合,形成更大的结构,提高灵活性和可扩展性。
1.桥接模式
- 定义:将抽象部分与实现部分分离,使它们可以独立变化。
- 应用场景:跨平台图表库、驱动框架等。
- 优点:避免继承导致的类爆炸,提高扩展性。
2.代理模式
- 定义:为其他对象提供代理以控制访问。
- 应用场景:RPC调用、AOP编程等。
- 类型:静态代理、动态代理(JDK/CGLIB)。
3.组合模式
- 定义:将对象组合成树形结构,表示“部分-整体”层次。
- 应用场景:文件系统、GUI组件树等。
- 优点:统一处理单个对象和组合对象。
4.适配器模式
- 定义:将不兼容的接口转换为客户端期望的接口。
- 应用场景:旧系统改造、第三方库集成等。
- 类型:类适配器(继承)、对象适配器(组合)。
5.享元模式
- 定义:共享大量细粒度对象,减少内存占用。
- 应用场景:字符串常量池、线程池等。
- 核心:区分内部状态(共享)和外部状态(独立)。
6.装饰器模式
- 定义:动态添加职责到对象,比继承更灵活。
- 应用场景:Java I/O流、日志装饰器等。
- 优点:避免子类膨胀,功能扩展开放。
7.外观模式
- 定义:为复杂子系统提供简化接口。
- 应用场景:分布式系统、家庭影院控制等。
- 优点:降低客户端与子系统的耦合度。
三、行为型模式(11种)
关注对象间的通信和职责分配,提高灵活性和可维护性。
1.访问者模式
- 定义:将操作作用于对象结构中的元素,支持新操作扩展。
- 应用场景:编译器语法树分析、XML解析等。
- 缺点:增加对象结构时需修改所有访问者。
2.策略模式
- 定义:定义算法族,封装并使其可互换。
- 应用场景:排序算法、支付方式选择等。
- 优点:避免条件语句,便于扩展新算法。
3.备忘录模式
- 定义:捕获并保存对象状态,以便后续恢复。
- 应用场景:游戏存档、文本编辑器撤销操作等。
- 核心:备忘录对象(存储状态)、原发器(被保存对象)、管理者(管理备忘录)。
4.观察者模式
- 定义:定义一对多依赖,主题状态变化时通知观察者。
- 应用场景:事件处理、消息订阅等。
- 实现方式:Java中的Observer接口或自定义事件总线。
5.模板方法模式
- 定义:定义算法骨架,将步骤延迟到子类实现。
- 应用场景:框架设计、单元测试框架等。
- 核心:抽象类定义模板方法,子类实现具体步骤。
6.迭代器模式
- 定义:提供顺序访问聚合对象元素的方法,不暴露内部结构。
- 应用场景:集合遍历、树形结构遍历等。
- 优点:统一访问接口,支持不同遍历方式。
7.状态模式
- 定义:允许对象在内部状态改变时改变行为。
- 应用场景:订单状态机、游戏角色状态等。
- 优点:避免大量条件语句,符合开闭原则。
8.命令模式
- 定义:将请求封装为对象,支持参数化、队列和日志。
- 应用场景:事务管理、撤销操作等。
- 优点:将操作与接收者解耦。
9.中介者模式
- 定义:用中介对象封装对象间交互,减少耦合。
- 应用场景:聊天室、GUI组件交互等。
- 优点:避免对象间直接引用,降低复杂度。
10.解释器模式
- 定义:定义语言的文法表示,并解释执行。
- 应用场景:SQL解析、正则表达式等。
- 缺点:复杂语言解析效率低。
11.责任链模式
- 定义:将请求沿处理链传递,直到有对象处理它。
- 应用场景:Web请求处理、审批流程等。
- 优点:解耦请求发送者和接收者。
速记口诀
- 单抽工建原。
- 桥代理组装适配器,享元回家装饰外观。
- 访问者写好策略备忘录,观察模板迭代的状态,命令中介解释责任链。