Python 设计模式完全指南:创建型 / 结构型 / 行为型模式详解与实战
设计模式是解决特定问题的经典解决方案,是软件设计的最佳实践。Python 作为一门灵活的面向对象语言,提供了丰富的设计模式实现方式。本文全面讲解 23 种设计模式,每个模式提供完整代码示例和实际应用场景。

本文内容包括:
- 创建型模式(5 种)
- 结构型模式(7 种)
- 行为型模式(11 种)
- 设计模式选择指南
- Python 设计模式最佳实践
一、创建型模式(Creational Patterns)
创建型模式关注对象的创建过程,将对象的创建与使用分离。
1.1 单例模式(Singleton)
确保类只有一个实例,并提供全局访问点。
# 方法1:使用 __new__class Singleton: _instance = None
def __new__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance
# 方法2:线程安全单例import threading
class ThreadSafeSingleton: _instance = None _lock = threading.Lock()
def __new__(cls, *args, **kwargs): with cls._lock: if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance
# 方法3:使用 metaclassclass 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 Logger(metaclass=SingletonMeta): def log(self, message): print(f"[LOG] {message}")
# 方法4:使用模块(Python 最简洁方式)# logger.py# logger = Logger()# import logger; logger.log("hello")
# 使用logger1 = Logger()logger2 = Logger()print(logger1 is logger2) # True应用场景:日志记录器、数据库连接池、配置管理器、全局缓存。
1.2 工厂模式(Factory)
将对象创建封装在工厂类中,根据参数返回不同类型的对象。
from abc import ABC, abstractmethod
# 抽象产品class Product(ABC): @abstractmethod def operation(self) -> str: pass
# 具体产品class ConcreteProductA(Product): def operation(self) -> str: return "Result of ConcreteProductA"
class ConcreteProductB(Product): def operation(self) -> str: return "Result of ConcreteProductB"
# 工厂类class Factory: def create(self, type: str) -> Product: if type == "A": return ConcreteProductA() elif type == "B": return ConcreteProductB() raise ValueError(f"Unknown type: {type}")
# 使用factory = Factory()product_a = factory.create("A")product_b = factory.create("B")print(product_a.operation()) # Result of ConcreteProductA应用场景:数据库连接创建、文件解析器、UI 组件创建。
1.3 抽象工厂模式(Abstract Factory)
提供创建一系列相关或依赖对象的接口,无需指定具体类。
from abc import ABC, abstractmethod
# 抽象工厂class AbstractFactory(ABC): @abstractmethod def create_product_a(self): pass
@abstractmethod def create_product_b(self): pass
# 具体工厂1class ConcreteFactory1(AbstractFactory): def create_product_a(self): return ProductA1()
def create_product_b(self): return ProductB1()
# 具体工厂2class ConcreteFactory2(AbstractFactory): def create_product_a(self): return ProductA2()
def create_product_b(self): return ProductB2()
# 产品族class ProductA1: def interact(self, other): return f"A1 interacts with {other.__class__.__name__}"
class ProductB1: def interact(self, other): return f"B1 interacts with {other.__class__.__name__}"
class ProductA2: def interact(self, other): return f"A2 interacts with {other.__class__.__name__}"
class ProductB2: def interact(self, other): return f"B2 interacts with {other.__class__.__name__}"
# 使用factory1 = ConcreteFactory1()a1 = factory1.create_product_a()b1 = factory1.create_product_b()print(a1.interact(b1)) # A1 interacts with ProductB1应用场景:跨平台 UI 组件、数据库驱动、主题系统。
1.4 建造者模式(Builder)
将复杂对象的构建过程与表示分离,使同样的构建过程可以创建不同的表示。
from abc import ABC, abstractmethod
# 产品class Computer: def __init__(self): self.cpu = None self.memory = None self.storage = None self.gpu = None
def __str__(self): return f"Computer: CPU={self.cpu}, Memory={self.memory}, Storage={self.storage}, GPU={self.gpu}"
# 抽象建造者class Builder(ABC): @abstractmethod def build_cpu(self): pass
@abstractmethod def build_memory(self): pass
@abstractmethod def build_storage(self): pass
@abstractmethod def build_gpu(self): pass
@abstractmethod def get_product(self) -> Computer: pass
# 具体建造者class GamingBuilder(Builder): def __init__(self): self.computer = Computer()
def build_cpu(self): self.computer.cpu = "Intel i9-14900K"
def build_memory(self): self.computer.memory = "32GB DDR5"
def build_storage(self): self.computer.storage = "2TB NVMe"
def build_gpu(self): self.computer.gpu = "NVIDIA RTX 4090"
def get_product(self): return self.computer
class OfficeBuilder(Builder): def __init__(self): self.computer = Computer()
def build_cpu(self): self.computer.cpu = "Intel i5-14600K"
def build_memory(self): self.computer.memory = "16GB DDR4"
def build_storage(self): self.computer.storage = "512GB SSD"
def build_gpu(self): self.computer.gpu = "Integrated"
def get_product(self): return self.computer
# 指挥者class Director: def __init__(self, builder: Builder): self.builder = builder
def construct(self): self.builder.build_cpu() self.builder.build_memory() self.builder.build_storage() self.builder.build_gpu()
# 使用gaming_builder = GamingBuilder()director = Director(gaming_builder)director.construct()gaming_pc = gaming_builder.get_product()print(gaming_pc)应用场景:复杂对象构建(电脑、汽车、报表)、配置对象、API 请求构建。
1.5 原型模式(Prototype)
通过复制现有对象创建新对象,避免重复初始化。
import copy
class Prototype: def clone(self): return copy.deepcopy(self)
class User(Prototype): def __init__(self, name, roles=None): self.name = name self.roles = roles or []
def __str__(self): return f"User: {self.name}, Roles: {self.roles}"
# 使用base_user = User("Admin", ["admin", "user"])user1 = base_user.clone()user1.name = "Alice"user1.roles.append("editor")
user2 = base_user.clone()user2.name = "Bob"
print(base_user) # User: Admin, Roles: ['admin', 'user']print(user1) # User: Alice, Roles: ['admin', 'user', 'editor']print(user2) # User: Bob, Roles: ['admin', 'user']应用场景:大量相似对象创建、对象初始化成本高、配置模板。
二、结构型模式(Structural Patterns)
结构型模式关注类或对象的组合,形成更大的结构。
2.1 适配器模式(Adapter)
将一个类的接口转换成客户希望的另一个接口。
# 目标接口class Target: def request(self) -> str: return "Target: Default request"
# 适配者(被适配的类)class Adaptee: def specific_request(self) -> str: return ".eetpadA eht fo esuac siht"
# 适配器class Adapter(Target): def __init__(self, adaptee: Adaptee): self.adaptee = adaptee
def request(self) -> str: return f"Adapter: {self.adaptee.specific_request()[::-1]}"
# 使用adaptee = Adaptee()adapter = Adapter(adaptee)print(adapter.request()) # Adapter: This is the cause of the Adapter.应用场景:旧代码兼容新接口、第三方库集成、接口转换。
2.2 装饰器模式(Decorator)
动态地给对象添加额外功能。
from abc import ABC, abstractmethod
# 抽象组件class Component(ABC): @abstractmethod def operation(self) -> str: pass
# 具体组件class ConcreteComponent(Component): def operation(self) -> str: return "ConcreteComponent"
# 抽象装饰器class Decorator(Component): def __init__(self, component: Component): self.component = component
@abstractmethod def operation(self) -> str: return self.component.operation()
# 具体装饰器class ConcreteDecoratorA(Decorator): def operation(self) -> str: return f"ConcreteDecoratorA({self.component.operation()})"
class ConcreteDecoratorB(Decorator): def operation(self) -> str: return f"ConcreteDecoratorB({self.component.operation()})"
# 使用component = ConcreteComponent()decorated = ConcreteDecoratorB(ConcreteDecoratorA(component))print(decorated.operation())# ConcreteDecoratorB(ConcreteDecoratorA(ConcreteComponent))
# Python 语法糖装饰器def bold(func): def wrapper(*args, **kwargs): return f"<b>{func(*args, **kwargs)}</b>" return wrapper
def italic(func): def wrapper(*args, **kwargs): return f"<i>{func(*args, **kwargs)}</i>" return wrapper
@bold@italicdef greet(name): return f"Hello, {name}"
print(greet("Alice")) # <b><i>Hello, Alice</i></b>应用场景:功能增强、日志记录、性能监控、权限验证。
2.3 代理模式(Proxy)
为其他对象提供代理,控制对原对象的访问。
from abc import ABC, abstractmethod
# 抽象主题class Subject(ABC): @abstractmethod def request(self): pass
# 真实主题class RealSubject(Subject): def request(self): print("RealSubject: Handling request")
# 代理class Proxy(Subject): def __init__(self, real_subject: RealSubject): self.real_subject = real_subject
def request(self): if self.check_access(): self.log_access() self.real_subject.request()
def check_access(self) -> bool: print("Proxy: Checking access prior to firing a request.") return True
def log_access(self): print("Proxy: Logging the time of request.")
# 使用proxy = Proxy(RealSubject())proxy.request()应用场景:延迟加载、访问控制、缓存、日志记录、远程代理。
2.4 组合模式(Composite)
将对象组合成树形结构,以表示”部分-整体”的层次结构。
from abc import ABC, abstractmethodfrom typing import List
class Component(ABC): def __init__(self, name): self.name = name
@abstractmethod def operation(self, depth=0): pass
def add(self, component): pass
def remove(self, component): pass
class Leaf(Component): def operation(self, depth=0): print(" " * depth + f"- Leaf: {self.name}")
class Composite(Component): def __init__(self, name): super().__init__(name) self.children: List[Component] = []
def add(self, component: Component): self.children.append(component)
def remove(self, component: Component): self.children.remove(component)
def operation(self, depth=0): print(" " * depth + f"+ Composite: {self.name}") for child in self.children: child.operation(depth + 1)
# 使用root = Composite("Root")branch1 = Composite("Branch1")branch2 = Composite("Branch2")
leaf1 = Leaf("Leaf1")leaf2 = Leaf("Leaf2")leaf3 = Leaf("Leaf3")
branch1.add(leaf1)branch1.add(leaf2)branch2.add(leaf3)root.add(branch1)root.add(branch2)
root.operation()# + Composite: Root# + Composite: Branch1# - Leaf: Leaf1# - Leaf: Leaf2# + Composite: Branch2# - Leaf: Leaf3应用场景:文件系统、UI 组件树、菜单系统、组织架构。
2.5 外观模式(Facade)
为子系统中的一组接口提供一个统一的高层接口。
class SubsystemA: def operation_a(self): return "SubsystemA: Operation A"
class SubsystemB: def operation_b(self): return "SubsystemB: Operation B"
class SubsystemC: def operation_c(self): return "SubsystemC: Operation C"
class Facade: def __init__(self): self.subsystem_a = SubsystemA() self.subsystem_b = SubsystemB() self.subsystem_c = SubsystemC()
def operation(self): results = [] results.append(self.subsystem_a.operation_a()) results.append(self.subsystem_b.operation_b()) results.append(self.subsystem_c.operation_c()) return "\n".join(results)
# 使用facade = Facade()print(facade.operation())# SubsystemA: Operation A# SubsystemB: Operation B# SubsystemC: Operation C应用场景:简化复杂系统接口、第三方库封装、模块入口。
2.6 桥接模式(Bridge)
将抽象与实现分离,使它们可以独立变化。
from abc import ABC, abstractmethod
# 实现接口class Implementation(ABC): @abstractmethod def operation_impl(self) -> str: pass
class ConcreteImplementationA(Implementation): def operation_impl(self) -> str: return "ConcreteImplementationA"
class ConcreteImplementationB(Implementation): def operation_impl(self) -> str: return "ConcreteImplementationB"
# 抽象类class Abstraction: def __init__(self, implementation: Implementation): self.implementation = implementation
def operation(self) -> str: return f"Abstraction: Base operation with {self.implementation.operation_impl()}"
# 扩展抽象类class ExtendedAbstraction(Abstraction): def operation(self) -> str: return f"ExtendedAbstraction: Extended operation with {self.implementation.operation_impl()}"
# 使用impl_a = ConcreteImplementationA()impl_b = ConcreteImplementationB()
abstraction = Abstraction(impl_a)print(abstraction.operation())
extended = ExtendedAbstraction(impl_b)print(extended.operation())应用场景:跨平台开发、UI 框架、数据库驱动。
2.7 享元模式(Flyweight)
运用共享技术有效地支持大量细粒度的对象。
import jsonfrom typing import Dict
class Flyweight: def __init__(self, shared_state: str): self.shared_state = shared_state
def operation(self, unique_state: str): s = json.dumps(self.shared_state) u = json.dumps(unique_state) return f"Flyweight: Shared={s}, Unique={u}"
class FlyweightFactory: _flyweights: Dict[str, Flyweight] = {}
def get_flyweight(self, shared_state: str) -> Flyweight: if shared_state not in self._flyweights: self._flyweights[shared_state] = Flyweight(shared_state) return self._flyweights[shared_state]
def list_flyweights(self): return len(self._flyweights)
# 使用factory = FlyweightFactory()
# 创建享元对象flyweight1 = factory.get_flyweight("shared_state_1")flyweight2 = factory.get_flyweight("shared_state_1")flyweight3 = factory.get_flyweight("shared_state_2")
print(flyweight1 is flyweight2) # True(同一对象)print(flyweight1 is flyweight3) # False(不同对象)
# 统计创建的对象数量print(f"Flyweights created: {factory.list_flyweights()}") # 2应用场景:大量相似对象(字符、图形、棋子)、缓存系统、连接池。
三、行为型模式(Behavioral Patterns)
行为型模式关注对象间的通信和职责分配。
3.1 观察者模式(Observer)
定义对象间的一对多依赖,当一个对象状态改变时,所有依赖者都会收到通知。
from abc import ABC, abstractmethodfrom typing import List
class Subject(ABC): @abstractmethod def attach(self, observer): pass
@abstractmethod def detach(self, observer): pass
@abstractmethod def notify(self): pass
class ConcreteSubject(Subject): def __init__(self): self._observers: List[Observer] = [] self._state = None
@property def state(self): return self._state
@state.setter def state(self, value): self._state = value self.notify()
def attach(self, observer): if observer not in self._observers: self._observers.append(observer)
def detach(self, observer): self._observers.remove(observer)
def notify(self): for observer in self._observers: observer.update(self)
class Observer(ABC): @abstractmethod def update(self, subject): pass
class ConcreteObserverA(Observer): def update(self, subject): if subject.state < 3: print("ConcreteObserverA: Reacted to the event")
class ConcreteObserverB(Observer): def update(self, subject): if subject.state >= 3: print("ConcreteObserverB: Reacted to the event")
# 使用subject = ConcreteSubject()observer_a = ConcreteObserverA()observer_b = ConcreteObserverB()
subject.attach(observer_a)subject.attach(observer_b)
subject.state = 2 # ConcreteObserverA: Reacted to the eventsubject.state = 4 # ConcreteObserverB: Reacted to the event
# Python 内置 Observer(weakref)from weakref import WeakKeyDictionary
class EventManager: def __init__(self): self._listeners = WeakKeyDictionary()
def register(self, listener): self._listeners[listener] = True
def unregister(self, listener): del self._listeners[listener]
def notify(self, event): for listener in list(self._listeners.keys()): listener.on_event(event)
class Listener: def on_event(self, event): print(f"Listener received: {event}")应用场景:事件系统、发布订阅、GUI 组件、日志系统、消息队列。
3.2 策略模式(Strategy)
定义一系列算法,把它们封装起来,并使它们可以互相替换。
from abc import ABC, abstractmethod
class Strategy(ABC): @abstractmethod def execute(self, data): pass
class ConcreteStrategyA(Strategy): def execute(self, data): return sorted(data)
class ConcreteStrategyB(Strategy): def execute(self, data): return sorted(data, reverse=True)
class ConcreteStrategyC(Strategy): def execute(self, data): return list(set(data))
class Context: def __init__(self, strategy: Strategy): self._strategy = strategy
@property def strategy(self): return self._strategy
@strategy.setter def strategy(self, strategy: Strategy): self._strategy = strategy
def do_something(self, data): return self._strategy.execute(data)
# 使用data = [3, 1, 4, 1, 5, 9]
context = Context(ConcreteStrategyA())print(context.do_something(data)) # [1, 1, 3, 4, 5, 9]
context.strategy = ConcreteStrategyB()print(context.do_something(data)) # [9, 5, 4, 3, 1, 1]
context.strategy = ConcreteStrategyC()print(context.do_something(data)) # [1, 3, 4, 5, 9]应用场景:算法切换、排序策略、支付方式、日志级别。
3.3 命令模式(Command)
将请求封装成对象,使你可以用不同的请求对客户进行参数化。
from abc import ABC, abstractmethod
class Receiver: def action(self): print("Receiver: Performing action")
class Command(ABC): @abstractmethod def execute(self): pass
@abstractmethod def undo(self): pass
class ConcreteCommand(Command): def __init__(self, receiver: Receiver): self.receiver = receiver
def execute(self): self.receiver.action()
def undo(self): print("ConcreteCommand: Undoing action")
class Invoker: def __init__(self): self._commands = []
def add_command(self, command: Command): self._commands.append(command)
def execute_commands(self): for command in self._commands: command.execute()
def undo_commands(self): for command in reversed(self._commands): command.undo()
# 使用receiver = Receiver()command = ConcreteCommand(receiver)invoker = Invoker()invoker.add_command(command)
invoker.execute_commands() # Receiver: Performing actioninvoker.undo_commands() # ConcreteCommand: Undoing action应用场景:撤销/重做、事务管理、菜单命令、任务队列。
3.4 责任链模式(Chain of Responsibility)
将请求沿着处理链传递,直到有一个处理器处理它。
from abc import ABC, abstractmethod
class Handler(ABC): def __init__(self): self._next_handler = None
def set_next(self, handler): self._next_handler = handler return handler
@abstractmethod def handle(self, request): pass
class ConcreteHandlerA(Handler): def handle(self, request): if request < 10: print(f"ConcreteHandlerA handled request: {request}") elif self._next_handler: self._next_handler.handle(request)
class ConcreteHandlerB(Handler): def handle(self, request): if 10 <= request < 20: print(f"ConcreteHandlerB handled request: {request}") elif self._next_handler: self._next_handler.handle(request)
class ConcreteHandlerC(Handler): def handle(self, request): if request >= 20: print(f"ConcreteHandlerC handled request: {request}") elif self._next_handler: self._next_handler.handle(request)
# 使用handler_a = ConcreteHandlerA()handler_b = ConcreteHandlerB()handler_c = ConcreteHandlerC()
handler_a.set_next(handler_b).set_next(handler_c)
handler_a.handle(5) # ConcreteHandlerA handled request: 5handler_a.handle(15) # ConcreteHandlerB handled request: 15handler_a.handle(25) # ConcreteHandlerC handled request: 25应用场景:日志级别、权限验证、请求处理管道、中间件。
3.5 状态模式(State)
允许对象在其内部状态改变时改变它的行为。
from abc import ABC, abstractmethod
class Context: def __init__(self, state): self._state = state
@property def state(self): return self._state
@state.setter def state(self, state): self._state = state print(f"Context: Transition to {type(state).__name__}")
def request(self): self._state.handle(self)
class State(ABC): @abstractmethod def handle(self, context): pass
class ConcreteStateA(State): def handle(self, context): print("ConcreteStateA: Handling request") context.state = ConcreteStateB()
class ConcreteStateB(State): def handle(self, context): print("ConcreteStateB: Handling request") context.state = ConcreteStateA()
# 使用context = Context(ConcreteStateA())context.request() # Transition to ConcreteStateBcontext.request() # Transition to ConcreteStateA应用场景:状态机、工作流、游戏状态、UI 状态。
3.6 模板方法模式(Template Method)
定义算法骨架,将某些步骤延迟到子类实现。
from abc import ABC, abstractmethod
class AbstractClass(ABC): def template_method(self): self.base_operation1() self.required_operations1() self.base_operation2() self.hook1() self.required_operations2() self.base_operation3() self.hook2()
def base_operation1(self): print("AbstractClass: Base operation 1")
def base_operation2(self): print("AbstractClass: Base operation 2")
def base_operation3(self): print("AbstractClass: Base operation 3")
@abstractmethod def required_operations1(self): pass
@abstractmethod def required_operations2(self): pass
def hook1(self): pass
def hook2(self): pass
class ConcreteClass(AbstractClass): def required_operations1(self): print("ConcreteClass: Required operation 1")
def required_operations2(self): print("ConcreteClass: Required operation 2")
def hook1(self): print("ConcreteClass: Overridden hook 1")
# 使用concrete = ConcreteClass()concrete.template_method()应用场景:框架设计、算法标准化、代码复用。
3.7 迭代器模式(Iterator)
提供一种方法顺序访问聚合对象中的各个元素,而又不暴露该对象的内部表示。
from abc import ABC, abstractmethodfrom typing import List, Any
class Iterator(ABC): @abstractmethod def has_next(self) -> bool: pass
@abstractmethod def next(self) -> Any: pass
class ConcreteIterator(Iterator): def __init__(self, collection: List[Any]): self._collection = collection self._index = 0
def has_next(self) -> bool: return self._index < len(self._collection)
def next(self) -> Any: item = self._collection[self._index] self._index += 1 return item
class Aggregate(ABC): @abstractmethod def create_iterator(self) -> Iterator: pass
class ConcreteAggregate(Aggregate): def __init__(self): self._items: List[Any] = []
def add_item(self, item): self._items.append(item)
def create_iterator(self) -> Iterator: return ConcreteIterator(self._items)
# 使用aggregate = ConcreteAggregate()aggregate.add_item("Item 1")aggregate.add_item("Item 2")aggregate.add_item("Item 3")
iterator = aggregate.create_iterator()while iterator.has_next(): print(iterator.next())
# Python 内置迭代器for item in aggregate._items: print(item)应用场景:集合遍历、自定义数据结构、分页处理。
3.8 访问者模式(Visitor)
表示对某对象结构中各元素执行的操作,可在不改变元素类的前提下定义新操作。
from abc import ABC, abstractmethodfrom typing import List
class Element(ABC): @abstractmethod def accept(self, visitor): pass
class ConcreteElementA(Element): def accept(self, visitor): visitor.visit_concrete_element_a(self)
class ConcreteElementB(Element): def accept(self, visitor): visitor.visit_concrete_element_b(self)
class Visitor(ABC): @abstractmethod def visit_concrete_element_a(self, element): pass
@abstractmethod def visit_concrete_element_b(self, element): pass
class ConcreteVisitor(Visitor): def visit_concrete_element_a(self, element): print("ConcreteVisitor: Visiting ConcreteElementA")
def visit_concrete_element_b(self, element): print("ConcreteVisitor: Visiting ConcreteElementB")
# 使用elements: List[Element] = [ConcreteElementA(), ConcreteElementB()]visitor = ConcreteVisitor()
for element in elements: element.accept(visitor)应用场景:数据导出、报表生成、操作扩展。
3.9 中介者模式(Mediator)
定义一个中介对象来封装一系列对象的交互。
from abc import ABC, abstractmethod
class Mediator(ABC): @abstractmethod def notify(self, sender, event): pass
class ConcreteMediator(Mediator): def __init__(self): self._components = []
def add_component(self, component): self._components.append(component) component.mediator = self
def notify(self, sender, event): for component in self._components: if component != sender: component.receive(event)
class Component: def __init__(self, name): self.name = name self.mediator = None
def send(self, event): print(f"{self.name} sends: {event}") self.mediator.notify(self, event)
def receive(self, event): print(f"{self.name} receives: {event}")
# 使用mediator = ConcreteMediator()
comp1 = Component("Component1")comp2 = Component("Component2")comp3 = Component("Component3")
mediator.add_component(comp1)mediator.add_component(comp2)mediator.add_component(comp3)
comp1.send("Hello")# Component1 sends: Hello# Component2 receives: Hello# Component3 receives: Hello应用场景:UI 组件通信、聊天室、微服务协调。
3.10 备忘录模式(Memento)
保存对象的内部状态,以便在需要时恢复。
class Memento: def __init__(self, state): self._state = state
def get_state(self): return self._state
class Originator: def __init__(self, state): self._state = state
def do_something(self): self._state = f"Modified {self._state}"
def save(self) -> Memento: return Memento(self._state)
def restore(self, memento: Memento): self._state = memento.get_state()
def __str__(self): return f"State: {self._state}"
class Caretaker: def __init__(self, originator: Originator): self._originator = originator self._mementos = []
def save(self): self._mementos.append(self._originator.save())
def undo(self): if self._mementos: memento = self._mementos.pop() self._originator.restore(memento)
# 使用originator = Originator("Initial State")caretaker = Caretaker(originator)
print(originator) # State: Initial State
caretaker.save()originator.do_something()print(originator) # State: Modified Initial State
caretaker.save()originator.do_something()print(originator) # State: Modified Modified Initial State
caretaker.undo()print(originator) # State: Modified Initial State
caretaker.undo()print(originator) # State: Initial State应用场景:撤销/重做、状态快照、事务回滚。
3.11 解释器模式(Interpreter)
给定一个语言,定义它的语法表示,并定义一个解释器。
from abc import ABC, abstractmethodfrom typing import List
class Expression(ABC): @abstractmethod def interpret(self, context): pass
class TerminalExpression(Expression): def __init__(self, data): self._data = data
def interpret(self, context): return self._data in context
class OrExpression(Expression): def __init__(self, expr1, expr2): self._expr1 = expr1 self._expr2 = expr2
def interpret(self, context): return self._expr1.interpret(context) or self._expr2.interpret(context)
class AndExpression(Expression): def __init__(self, expr1, expr2): self._expr1 = expr1 self._expr2 = expr2
def interpret(self, context): return self._expr1.interpret(context) and self._expr2.interpret(context)
# 使用# 规则:Robert 和 John 是男性male = OrExpression(TerminalExpression("Robert"), TerminalExpression("John"))
# 规则:Julie 是已婚女性married_woman = AndExpression( TerminalExpression("Julie"), TerminalExpression("Married"))
print(f"John is male? {male.interpret('John')}") # Trueprint(f"Julie is married woman? {married_woman.interpret('Julie Married')}") # True应用场景:表达式解析、规则引擎、配置语言、SQL 解析。
四、设计模式选择指南
4.1 问题场景匹配
遇到什么问题?│├── 对象创建│ ├── 需要全局唯一实例 → 单例模式│ ├── 对象创建复杂 → 工厂模式│ ├── 产品族创建 → 抽象工厂模式│ ├── 复杂对象分步构建 → 建造者模式│ └── 对象初始化成本高 → 原型模式│├── 结构组织│ ├── 接口不兼容 → 适配器模式│ ├── 动态功能增强 → 装饰器模式│ ├── 访问控制 → 代理模式│ ├── 树形结构 → 组合模式│ ├── 简化接口 → 外观模式│ ├── 抽象与实现分离 → 桥接模式│ └── 大量相似对象 → 享元模式│├── 行为协调│ ├── 一对多通知 → 观察者模式│ ├── 算法可替换 → 策略模式│ ├── 请求封装 → 命令模式│ ├── 请求传递处理 → 责任链模式│ ├── 状态驱动行为 → 状态模式│ ├── 算法骨架固定 → 模板方法模式│ ├── 集合遍历 → 迭代器模式│ ├── 操作扩展 → 访问者模式│ ├── 对象解耦通信 → 中介者模式│ ├── 状态恢复 → 备忘录模式│ └── 语言解析 → 解释器模式4.2 Python 特有实现方式
| 模式 | Python 实现方式 |
|---|---|
| 单例模式 | __new__ / metaclass / 模块 |
| 装饰器模式 | @decorator 语法 |
| 迭代器模式 | __iter__ / __next__ |
| 工厂模式 | 函数 / 类方法 / __init_subclass__ |
| 观察者模式 | weakref / functools |
| 策略模式 | 函数作为参数 / 字典映射 |
五、最佳实践
5.1 使用原则
✅ 不要过度设计,简单代码优先✅ 遇到问题再应用模式,不要预先设计✅ 理解模式的意图,不要生搬硬套✅ 优先使用 Python 内置机制(装饰器、迭代器等)✅ 组合优于继承✅ 面向接口编程,而非面向实现✅ 依赖倒置:高层模块不依赖低层模块✅ 开闭原则:对扩展开放,对修改关闭5.2 常见误区
❌ 滥用单例模式(全局状态难测试)❌ 过度使用模式(简单问题复杂化)❌ 模式命名不当(代码可读性差)❌ 模式嵌套过深(难以维护)❌ 忽略 Python 语言特性(重新发明轮子)❌ 设计模式银弹化(没有万能模式)5.3 学习路径
入门 → 进阶 → 精通 │ │ │ │ │ ├── 模式组合应用 │ │ ├── 模式反模式识别 │ │ └── 架构层面应用 │ │ │ ├── 理解模式意图 │ ├── 实际场景应用 │ └── 模式优缺点分析 │ ├── 阅读 GoF 设计模式 ├── 编写代码示例 └── 在项目中尝试使用六、总结
设计模式是软件设计的经典智慧结晶。掌握设计模式可以:
- 提高代码质量:写出更清晰、更可维护的代码
- 提升架构能力:更好地设计系统架构
- 促进团队沟通:用模式语言交流设计思路
- 解决常见问题:快速解决重复性问题
23 种设计模式速览:
| 类别 | 模式 | 核心思想 |
|---|---|---|
| 创建型 | 单例 | 全局唯一实例 |
| 创建型 | 工厂 | 对象创建封装 |
| 创建型 | 抽象工厂 | 产品族创建 |
| 创建型 | 建造者 | 分步构建 |
| 创建型 | 原型 | 克隆创建 |
| 结构型 | 适配器 | 接口转换 |
| 结构型 | 装饰器 | 功能增强 |
| 结构型 | 代理 | 访问控制 |
| 结构型 | 组合 | 树形结构 |
| 结构型 | 外观 | 统一接口 |
| 结构型 | 桥接 | 抽象与实现分离 |
| 结构型 | 享元 | 对象复用 |
| 行为型 | 观察者 | 事件通知 |
| 行为型 | 策略 | 算法替换 |
| 行为型 | 命令 | 请求封装 |
| 行为型 | 责任链 | 请求传递 |
| 行为型 | 状态 | 状态驱动 |
| 行为型 | 模板方法 | 算法骨架 |
| 行为型 | 迭代器 | 集合遍历 |
| 行为型 | 访问者 | 操作扩展 |
| 行为型 | 中介者 | 对象解耦 |
| 行为型 | 备忘录 | 状态恢复 |
| 行为型 | 解释器 | 语言解析 |
记住:设计模式是工具,不是目标。不要为了用模式而用模式,而是在真正需要时使用。2026 年,设计模式仍然是软件工程师必备的知识体系。