设计模式速查表
概述
本文档提供设计模式的快速参考,包括模式分类、意图、适用场景和关键实现要点。适用于快速查阅和模式选择决策。
创建型模式速查
模式概览
| 模式 | 意图 | 核心结构 | 适用场景 |
|---|---|---|---|
| 单例模式 | 确保唯一实例 | 私有构造 + 静态实例 | 配置管理、日志、连接池 |
| 工厂方法 | 延迟创建到子类 | Creator + Product接口 | 日志系统、数据库驱动 |
| 抽象工厂 | 创建产品家族 | AbstractFactory + 产品族 | 跨平台UI、数据库访问 |
| 建造者模式 | 分步构建复杂对象 | Builder + Director | SQL构建器、配置对象 |
| 原型模式 | 克隆创建对象 | clone()方法 | 原型注册表、深拷贝 |
创建型模式决策树
需要创建对象
│
├── 需要唯一实例?
│ └── 是 → 单例模式
│
├── 创建过程复杂,需要分步构建?
│ └── 是 → 建造者模式
│
├── 需要通过复制现有对象创建?
│ └── 是 → 原型模式
│
├── 需要创建相关对象家族?
│ └── 是 → 抽象工厂模式
│
└── 需要延迟创建决策到子类?
└── 是 → 工厂方法模式创建型模式实现要点
python
# 单例模式 - 元类实现
class SingletonMeta(type):
_instances = {}
def __call__(cls, *args, **kwargs):
if cls not in cls._instances:
cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls]
class Database(metaclass=SingletonMeta):
pass
# 工厂方法
class Product(ABC):
@abstractmethod
def operation(self) -> str: ...
class Creator(ABC):
@abstractmethod
def factory_method(self) -> Product: ...
def some_operation(self) -> str:
product = self.factory_method()
return product.operation()
# 抽象工厂
class GUIFactory(ABC):
@abstractmethod
def create_button(self) -> Button: ...
@abstractmethod
def create_checkbox(self) -> Checkbox: ...
# 建造者
class SQLBuilder:
def select(self, columns): ...
def from_table(self, table): ...
def where(self, condition): ...
def build(self) -> str: ...
# 原型
import copy
class Prototype:
def clone(self) -> 'Prototype':
return copy.deepcopy(self)结构型模式速查
模式概览
| 模式 | 意图 | 核心结构 | 适用场景 |
|---|---|---|---|
| 适配器模式 | 接口转换 | Adapter + Target | 第三方库集成、遗留代码 |
| 桥接模式 | 分离抽象与实现 | Abstraction + Implementation | 多维度变化、跨平台 |
| 组合模式 | 树形结构 | Component + Leaf + Composite | 文件系统、组织架构 |
| 装饰器模式 | 动态添加职责 | Component + Decorator | 中间件、流处理 |
| 外观模式 | 简化接口 | Facade | 子系统封装、API简化 |
| 享元模式 | 共享细粒度对象 | Flyweight + FlyweightFactory | 文字编辑、游戏对象 |
| 代理模式 | 控制访问 | Subject + Proxy | 延迟加载、访问控制 |
结构型模式决策树
结构问题
│
├── 接口不兼容?
│ └── 是 → 适配器模式
│
├── 需要动态添加功能?
│ └── 是 → 装饰器模式
│
├── 需要简化复杂接口?
│ └── 是 → 外观模式
│
├── 需要控制对象访问?
│ └── 是 → 代理模式
│
├── 需要树形结构?
│ └── 是 → 组合模式
│
├── 需要多维度独立变化?
│ └── 是 → 桥接模式
│
└── 需要共享大量细粒度对象?
└── 是 → 享元模式结构型模式实现要点
python
# 适配器
class Target(ABC):
@abstractmethod
def request(self) -> str: ...
class Adapter(Target):
def __init__(self, adaptee: Adaptee):
self._adaptee = adaptee
def request(self) -> str:
return self._adaptee.specific_request()
# 桥接
class Abstraction:
def __init__(self, implementation: Implementation):
self._implementation = implementation
# 组合
class Component(ABC):
@abstractmethod
def operation(self): ...
class Composite(Component):
def __init__(self):
self._children: List[Component] = []
# 装饰器
class Decorator(Component):
def __init__(self, component: Component):
self._component = component
# 外观
class Facade:
def __init__(self):
self._subsystem1 = Subsystem1()
self._subsystem2 = Subsystem2()
def operation(self):
return f"{self._subsystem1.op1()} + {self._subsystem2.op2()}"
# 享元
class FlyweightFactory:
_flyweights: Dict[str, Flyweight] = {}
def get_flyweight(self, key: str) -> Flyweight:
if key not in self._flyweights:
self._flyweights[key] = Flyweight(key)
return self._flyweights[key]
# 代理
class Proxy(Subject):
def __init__(self, real_subject: Subject):
self._real_subject = real_subject
def request(self):
if self.check_access():
self._real_subject.request()行为型模式速查
模式概览
| 模式 | 意图 | 核心结构 | 适用场景 |
|---|---|---|---|
| 责任链模式 | 链式处理请求 | Handler + ConcreteHandler | 中间件、审批流程 |
| 命令模式 | 封装请求为对象 | Command + Invoker + Receiver | 撤销操作、任务队列 |
| 解释器模式 | 定义语言文法 | AbstractExpression + Context | DSL、规则引擎 |
| 迭代器模式 | 遍历聚合对象 | Iterator + Aggregate | 自定义集合遍历 |
| 中介者模式 | 集中交互逻辑 | Mediator + Colleague | GUI组件、聊天室 |
| 备忘录模式 | 保存恢复状态 | Memento + Originator + Caretaker | 撤销、存档 |
| 观察者模式 | 一对多依赖通知 | Subject + Observer | 事件系统、数据绑定 |
| 状态模式 | 状态改变行为 | State + Context | 状态机、订单状态 |
| 策略模式 | 可互换算法 | Strategy + Context | 支付方式、排序算法 |
| 模板方法模式 | 算法骨架 | AbstractClass + ConcreteClass | 框架设计、流程模板 |
| 访问者模式 | 分离操作与结构 | Visitor + Element | 编译器、文档处理 |
行为型模式决策树
行为问题
│
├── 需要通知多个对象?
│ └── 是 → 观察者模式
│
├── 需要切换算法?
│ └── 是 → 策略模式
│
├── 需要状态改变行为?
│ └── 是 → 状态模式
│
├── 需要链式处理?
│ └── 是 → 责任链模式
│
├── 需要撤销功能?
│ ├── 简单撤销 → 命令模式
│ └── 状态快照 → 备忘录模式
│
├── 需要遍历集合?
│ └── 是 → 迭代器模式
│
├── 需要协调多个对象?
│ └── 是 → 中介者模式
│
├── 需要固定算法骨架?
│ └── 是 → 模板方法模式
│
├── 需要封装操作?
│ └── 是 → 命令模式
│
└── 需要在结构上添加操作?
└── 是 → 访问者模式行为型模式实现要点
python
# 责任链
class Handler(ABC):
def __init__(self, successor: 'Handler' = None):
self._successor = successor
@abstractmethod
def handle(self, request): ...
# 命令
class Command(ABC):
@abstractmethod
def execute(self): ...
@abstractmethod
def undo(self): ...
# 迭代器
class Iterator(ABC):
@abstractmethod
def __next__(self): ...
class Aggregate(ABC):
@abstractmethod
def create_iterator(self) -> Iterator: ...
# 中介者
class Mediator(ABC):
@abstractmethod
def notify(self, sender, event): ...
# 备忘录
@dataclass
class Memento:
state: str
class Originator:
def save(self) -> Memento: ...
def restore(self, memento: Memento): ...
# 观察者
class Subject:
def __init__(self):
self._observers: List[Observer] = []
def attach(self, observer): ...
def detach(self, observer): ...
def notify(self): ...
# 状态
class State(ABC):
@abstractmethod
def handle(self, context): ...
class Context:
def __init__(self, state: State):
self._state = state
def transition_to(self, state: State): ...
# 策略
class Strategy(ABC):
@abstractmethod
def execute(self, data): ...
class Context:
def __init__(self, strategy: Strategy):
self._strategy = strategy
# 模板方法
class AbstractClass(ABC):
def template_method(self):
self.step1()
self.step2()
self.hook()
@abstractmethod
def step1(self): ...
@abstractmethod
def step2(self): ...
# 访问者
class Visitor(ABC):
@abstractmethod
def visit_concrete_a(self, element): ...
@abstractmethod
def visit_concrete_b(self, element): ...模式关系图
┌─────────────────────────────────────────────────────────────────────────┐
│ 设计模式关系图 │
├─────────────────────────────────────────────────────────────────────────┤
│ │
│ 创建型模式 │
│ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 单例 │ │ 工厂方法 │ │ 抽象工厂 │ │
│ └────┬────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ │ ┌──────┴──────┐ │ │
│ │ │ │ │ │
│ ┌────▼────┐ │ ┌────▼─────┐ │ │
│ │ 原型 │◄───┘ │ 建造者 │◄────┘ │
│ └─────────┘ └──────────┘ │
│ │
│ 结构型模式 │
│ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 适配器 │ │ 桥接 │ │ 组合 │ │
│ └────┬────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │ │
│ │ ┌──────┴──────┐ │ │
│ │ │ │ │ │
│ ┌────▼────┐ │ ┌────▼─────┐ │ │
│ │ 装饰器 │◄───┘ │ 外观 │◄────┘ │
│ └────┬────┘ └──────────┘ │
│ │ │
│ ┌────▼────┐ ┌─────────────┐ │
│ │ 代理 │ │ 享元 │ │
│ └─────────┘ └─────────────┘ │
│ │
│ 行为型模式 │
│ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │责任链 │ │ 命令 │ │ 解释器 │ │
│ └─────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 迭代器 │ │ 中介者 │ │ 备忘录 │ │
│ └─────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 观察者 │ │ 状态 │ │ 策略 │ │
│ └─────────┘ └─────────────┘ └─────────────┘ │
│ ┌─────────┐ ┌─────────────┐ │
│ │模板方法 │ │ 访问者 │ │
│ └─────────┘ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────────┘模式组合使用
常见组合模式
| 组合 | 场景 | 说明 |
|---|---|---|
| 单例 + 工厂 | 配置管理 | 工厂作为单例确保全局唯一 |
| 工厂 + 策略 | 支付系统 | 工厂创建不同支付策略 |
| 装饰器 + 责任链 | Web中间件 | 装饰器包装处理链 |
| 观察者 + 状态 | 事件驱动 | 状态变化触发通知 |
| 组合 + 访问者 | 文档处理 | 访问者遍历组合结构 |
| 命令 + 备忘录 | 编辑器 | 命令执行时保存状态 |
| 建造者 + 原型 | 配置复制 | 建造者使用原型创建 |
企业级模式组合示例
python
# 组合: 抽象工厂 + 建造者 + 单例
class DatabaseFactory(metaclass=SingletonMeta):
def create_builder(self, db_type: str) -> 'QueryBuilder':
builders = {
'mysql': MySQLQueryBuilder,
'postgres': PostgreSQLQueryBuilder
}
return builders[db_type]()
class QueryBuilder(ABC):
@abstractmethod
def select(self, columns): ...
@abstractmethod
def build(self) -> str: ...
# 组合: 策略 + 工厂 + 观察者
class PaymentProcessor:
def __init__(self):
self._strategies: Dict[str, PaymentStrategy] = {}
self._observers: List[PaymentObserver] = []
def register_strategy(self, name: str, strategy: PaymentStrategy):
self._strategies[name] = strategy
def process(self, method: str, amount: float):
strategy = self._strategies[method]
result = strategy.pay(amount)
self._notify_observers(method, amount, result)
return result设计原则对照
SOLID原则与模式映射
| 原则 | 支持的模式 | 应用方式 |
|---|---|---|
| SRP | 外观、建造者、策略、命令 | 每个类专注单一职责 |
| OCP | 策略、观察者、装饰器、工厂方法 | 通过扩展而非修改 |
| LSP | 状态、策略、模板方法 | 子类可替换父类 |
| ISP | 适配器、桥接、代理、迭代器 | 接口职责单一 |
| DIP | 工厂方法、策略、观察者、命令 | 依赖抽象而非具体 |
原则冲突处理
| 冲突 | 解决方案 |
|---|---|
| 简洁性 vs 扩展性 | 优先简洁,稳定变化点再抽象 |
| 性能 vs 灵活性 | 热点代码可牺牲部分灵活性 |
| 复杂度 vs 可维护性 | 适度复杂度换取可维护性 |
快速决策指南
根据问题类型选择
问题类型 → 推荐模式
创建对象:
唯一实例 → 单例
复杂构建 → 建造者
克隆创建 → 原型
家族创建 → 抽象工厂
延迟决策 → 工厂方法
结构问题:
接口不兼容 → 适配器
添加功能 → 装饰器
简化接口 → 外观
控制访问 → 代理
树形结构 → 组合
多维变化 → 桥接
共享对象 → 享元
行为问题:
通知机制 → 观察者
算法切换 → 策略
状态变化 → 状态
链式处理 → 责任链
撤销操作 → 命令/备忘录
遍历集合 → 迭代器
协调交互 → 中介者
算法骨架 → 模板方法根据变化点选择
| 变化点 | 推荐模式 |
|---|---|
| 对象创建方式 | 工厂方法、抽象工厂、原型、建造者 |
| 对象结构 | 组合、装饰器、适配器、代理 |
| 对象行为 | 策略、状态、命令、观察者 |
| 算法实现 | 模板方法、策略 |
| 对象交互 | 中介者、观察者、责任链 |
| 对象状态 | 备忘录、状态 |
反模式警示
常见反模式
| 反模式 | 问题 | 正确做法 |
|---|---|---|
| 上帝类 | 类职责过多 | 应用SRP拆分 |
| 过度设计 | 不必要的抽象 | 应用YAGNI |
| 硬编码 | 魔法数字/字符串 | 使用策略/配置 |
| 循环依赖 | 模块相互依赖 | 应用DIP解耦 |
| 深层继承 | 继承层次过深 | 应用CRP组合 |
| 全局状态 | 滥用全局变量 | 使用依赖注入 |
模式滥用警示
| 模式 | 滥用场景 | 正确使用 |
|---|---|---|
| 单例 | 所有类都用 | 真正需要唯一实例时 |
| 装饰器 | 简单功能也包装 | 需要动态组合功能时 |
| 观察者 | 所有状态变化 | 真正需要通知机制时 |
| 工厂 | 简单对象创建 | 创建逻辑复杂时 |
| 策略 | 单一算法场景 | 需要切换算法时 |
检查清单
模式选择检查
- [ ] 是否明确了要解决的问题?
- [ ] 是否考虑了多种可选模式?
- [ ] 是否评估了模式的复杂度?
- [ ] 是否考虑了未来的变化?
- [ ] 是否遵循了相关设计原则?
模式实现检查
- [ ] 是否正确实现了模式的核心结构?
- [ ] 是否处理了边界情况?
- [ ] 是否考虑了线程安全?
- [ ] 是否提供了清晰的接口?
- [ ] 是否有适当的文档说明?
总结
设计模式是解决特定问题的成熟方案,选择合适的模式需要:
- 理解问题本质:明确要解决的问题类型
- 评估模式适用性:考虑模式的优缺点和适用场景
- 权衡复杂度:避免过度设计,保持简洁
- 遵循设计原则:以SOLID原则为指导
- 持续重构:根据实际需求调整设计
记住:模式是工具,不是目的。好的设计应该解决问题,而不是引入不必要的复杂性。