4854 字
24 分钟

Python 设计模式完全指南:创建型 / 结构型 / 行为型模式详解与实战

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

Python 设计模式完全指南

本文内容包括:

  • 创建型模式(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:使用 metaclass
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 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
# 具体工厂1
class ConcreteFactory1(AbstractFactory):
def create_product_a(self):
return ProductA1()
def create_product_b(self):
return ProductB1()
# 具体工厂2
class 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
@italic
def 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, abstractmethod
from 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 json
from 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, abstractmethod
from 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 event
subject.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 action
invoker.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: 5
handler_a.handle(15) # ConcreteHandlerB handled request: 15
handler_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 ConcreteStateB
context.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, abstractmethod
from 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, abstractmethod
from 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, abstractmethod
from 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')}") # True
print(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 设计模式
├── 编写代码示例
└── 在项目中尝试使用

六、总结#

设计模式是软件设计的经典智慧结晶。掌握设计模式可以:

  1. 提高代码质量:写出更清晰、更可维护的代码
  2. 提升架构能力:更好地设计系统架构
  3. 促进团队沟通:用模式语言交流设计思路
  4. 解决常见问题:快速解决重复性问题

23 种设计模式速览

类别模式核心思想
创建型单例全局唯一实例
创建型工厂对象创建封装
创建型抽象工厂产品族创建
创建型建造者分步构建
创建型原型克隆创建
结构型适配器接口转换
结构型装饰器功能增强
结构型代理访问控制
结构型组合树形结构
结构型外观统一接口
结构型桥接抽象与实现分离
结构型享元对象复用
行为型观察者事件通知
行为型策略算法替换
行为型命令请求封装
行为型责任链请求传递
行为型状态状态驱动
行为型模板方法算法骨架
行为型迭代器集合遍历
行为型访问者操作扩展
行为型中介者对象解耦
行为型备忘录状态恢复
行为型解释器语言解析

记住:设计模式是工具,不是目标。不要为了用模式而用模式,而是在真正需要时使用。2026 年,设计模式仍然是软件工程师必备的知识体系。

Python 设计模式完全指南:创建型 / 结构型 / 行为型模式详解与实战
https://971918.xyz/posts/python-guide/python-design-patterns/
作者
九所长
发布于
2026-07-27
许可协议
CC BY-NC-SA 4.0