设计模式(Design Patterns) 是软件工程中解决常见设计问题的可复用、最佳实践方案。它们不是现成的代码,而是经过验证的设计思想模板,帮助开发者构建灵活、可维护、可扩展的软件系统。
设计模式的核心价值
- 复用经验:避免重复“造轮子”,直接使用行业沉淀的成熟解决方案。
- 标准化沟通:如“用单例模式实现”,开发者立刻理解设计意图。
- 解耦代码:降低模块间的依赖性,提升系统灵活性。
- 提高可维护性:代码结构清晰,易于修改和扩展。
设计模式的分类(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();
学习设计模式的关键原则
- 理解场景:模式解决什么问题?何时用?何时不用?
- 遵循SOLID原则:
- 单一职责(一个类只做一件事)
- 开闭原则(对扩展开放,对修改关闭)
- 里氏替换(子类可替换父类)
- 接口隔离(接口尽量小而专)
- 依赖倒置(依赖抽象而非具体实现)
- 避免滥用:强行套用模式可能使代码更复杂。
推荐资源
- 书籍:《设计模式:可复用面向对象软件的基础》(GoF经典)
- 图解:Refactoring.Guru 网站(链接)
- 实践:在开源项目(如Spring、JDK)中观察模式应用。
设计模式是“术”,设计原则(如SOLID)才是“道”。掌握本质才能灵活运用!