全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-19 10 分钟 ✍️ juanwangdev

Python设计模式实践

设计模式是解决常见软件设计问题的可复用方案,Python有其独特的实现方式。

创建型模式

单例模式

Python
# 方式1:类变量实现
class Singleton:
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # True

# 方式2:元类实现
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):
    def __init__(self, connection_string):
        self.connection_string = connection_string

# 方式3:模块级单例(Python推荐)
# singleton.py
class _Singleton:
    def __init__(self):
        self.value = None

instance = _Singleton()

# 使用
from singleton import instance

工厂模式

Python
# 简单工厂
class AnimalFactory:
    @staticmethod
    def create(animal_type):
        animals = {
            'dog': Dog,
            'cat': Cat,
            'bird': Bird
        }
        return animals.get(animal_type)()

class Dog:
    def speak(self):
        return "Woof"

class Cat:
    def speak(self):
        return "Meow"

animal = AnimalFactory.create('dog')

# 抽象工厂
class AnimalFactory(ABC):
    @abstractmethod
    def create_pet(self):
        pass

class DogFactory(AnimalFactory):
    def create_pet(self):
        return Dog()

class CatFactory(AnimalFactory):
    def create_pet(self):
        return Cat()

# 客户端
factory = DogFactory()
pet = factory.create_pet()

建造者模式

Python
class ComputerBuilder:
    def __init__(self):
        self._computer = Computer()

    def set_cpu(self, cpu):
        self._computer.cpu = cpu
        return self

    def set_ram(self, ram):
        self._computer.ram = ram
        return self

    def set_storage(self, storage):
        self._computer.storage = storage
        return self

    def build(self):
        return self._computer

class Computer:
    def __init__(self):
        self.cpu = None
        self.ram = None
        self.storage = None

    def __str__(self):
        return f"CPU: {self.cpu}, RAM: {self.ram}, Storage: {self.storage}"

# 使用链式调用
computer = ComputerBuilder() \
    .set_cpu("Intel i7") \
    .set_ram("16GB") \
    .set_storage("512GB SSD") \
    .build()

结构型模式

适配器模式

Python
# 目标接口
class Target:
    def request(self):
        return "Target request"

# 被适配类
class Adaptee:
    def specific_request(self):
        return "Adaptee specific request"

# 适配器
class Adapter(Target):
    def __init__(self, adaptee):
        self.adaptee = adaptee

    def request(self):
        return self.adaptee.specific_request()

adaptee = Adaptee()
adapter = Adapter(adaptee)
adapter.request()

装饰器模式

Python
# Python原生装饰器实现

def logging_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Finished {func.__name__}")
        return result
    return wrapper

def retry_decorator(max_retries=3):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for i in range(max_retries):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    if i == max_retries - 1:
                        raise
                    print(f"Retry {i+1}")
        return wrapper
    return decorator

@logging_decorator
@retry_decorator(max_retries=3)
def fetch_data(url):
    return requests.get(url)

# 类装饰器
class CountDecorator:
    def __init__(self, func):
        self.func = func
        self.count = 0

    def __call__(self, *args, **kwargs):
        self.count += 1
        print(f"Call count: {self.count}")
        return self.func(*args, **kwargs)

@CountDecorator
def greet(name):
    return f"Hello {name}"

代理模式

Python
class RealService:
    def operation(self):
        return "Real operation"

class Proxy:
    def __init__(self, real_service):
        self.real_service = real_service
        self._cache = None

    def operation(self):
        # 缓存代理
        if self._cache is None:
            self._cache = self.real_service.operation()
        return self._cache

# 保护代理
class AccessProxy:
    def __init__(self, real_service, user):
        self.real_service = real_service
        self.user = user

    def operation(self):
        if self.user.role != 'admin':
            raise PermissionError("Access denied")
        return self.real_service.operation()

行为型模式

策略模式

Python
from abc import ABC, abstractmethod

class SortStrategy(ABC):
    @abstractmethod
    def sort(self, data):
        pass

class QuickSort(SortStrategy):
    def sort(self, data):
        return sorted(data)  # Python内置快速排序

class MergeSort(SortStrategy):
    def sort(self, data):
        # 实现归并排序
        pass

class Sorter:
    def __init__(self, strategy: SortStrategy):
        self.strategy = strategy

    def sort(self, data):
        return self.strategy.sort(data)

# 动态切换策略
sorter = Sorter(QuickSort())
result = sorter.sort([3, 1, 4, 1, 5])
sorter.strategy = MergeSort()

观察者模式

Python
class Observer:
    def update(self, data):
        pass

class Subject:
    def __init__(self):
        self._observers = []

    def attach(self, observer: Observer):
        self._observers.append(observer)

    def detach(self, observer: Observer):
        self._observers.remove(observer)

    def notify(self, data):
        for observer in self._observers:
            observer.update(data)

class EmailNotifier(Observer):
    def update(self, data):
        send_email(data)

class SMSNotifier(Observer):
    def update(self, data):
        send_sms(data)

# 使用
subject = Subject()
subject.attach(EmailNotifier())
subject.attach(SMSNotifier())
subject.notify("New event")

命令模式

Python
class Command(ABC):
    @abstractmethod
    def execute(self):
        pass

    @abstractmethod
    def undo(self):
        pass

class CreateFileCommand(Command):
    def __init__(self, filename):
        self.filename = filename

    def execute(self):
        open(self.filename, 'w').close()

    def undo(self):
        os.remove(self.filename)

class CommandManager:
    def __init__(self):
        self._history = []

    def execute(self, command: Command):
        command.execute()
        self._history.append(command)

    def undo(self):
        if self._history:
            command = self._history.pop()
            command.undo()

模板方法模式

Python
from abc import ABC, abstractmethod

class DataProcessor(ABC):
    def process(self, data):
        data = self.read(data)
        data = self.validate(data)
        data = self.transform(data)
        self.save(data)

    @abstractmethod
    def read(self, source):
        pass

    def validate(self, data):  # 可选覆盖
        return data

    @abstractmethod
    def transform(self, data):
        pass

    @abstractmethod
    def save(self, data):
        pass

class CSVProcessor(DataProcessor):
    def read(self, source):
        return pd.read_csv(source)

    def transform(self, data):
        return data.dropna()

    def save(self, data):
        data.to_csv('output.csv')

class JSONProcessor(DataProcessor):
    def read(self, source):
        return json.load(source)

    def transform(self, data):
        return {k: v for k, v in data.items() if v is not None}

    def save(self, data):
        json.dump(data, open('output.json', 'w'))

状态模式

Python
class State(ABC):
    @abstractmethod
    def handle(self, context):
        pass

class DraftState(State):
    def handle(self, context):
        context.state = ModerationState()
        return "Moved to moderation"

class ModerationState(State):
    def handle(self, context):
        context.state = PublishedState()
        return "Published"

class PublishedState(State):
    def handle(self, context):
        context.state = DraftState()
        return "Back to draft"

class Document:
    def __init__(self):
        self.state = DraftState()

    def process(self):
        return self.state.handle(self)

Python特有实现

使用字典实现策略

Python
# 替代策略模式的简单方式
STRATEGIES = {
    'quick': lambda data: sorted(data),
    'merge': merge_sort,
    'bubble': bubble_sort
}

def sort_data(data, strategy='quick'):
    return STRATEGIES[strategy](data)

使用函数替代命令

Python
# 函数作为命令
class UndoManager:
    def __init__(self):
        self._undo_stack = []

    def do(self, action, undo_action):
        action()
        self._undo_stack.append(undo_action)

    def undo(self):
        if self._undo_stack:
            self._undo_stack.pop()()

manager = UndoManager()
manager.do(
    lambda: create_file('test.txt'),
    lambda: delete_file('test.txt')
)

使用contextlib实现模板

Python
from contextlib import contextmanager

@contextmanager
def database_transaction():
    db = Database()
    db.begin_transaction()
    try:
        yield db
        db.commit()
    except:
        db.rollback()
        raise

with database_transaction() as db:
    db.execute("INSERT ...")

设计模式选择指南

问题类型推荐模式
对象创建复杂工厂、建造者
全局唯一实例单例
接口不兼容适配器
动态添加功能装饰器
算法可切换策略
事件通知观察者
操作可撤销命令
固定流程步骤模板方法

注意:Python的动态特性使得很多模式可以用更简单的方式实现,不要过度设计。

要点总结

  • 单例:Python推荐模块级单例或元类实现
  • 工厂:使用字典映射简化简单工厂,抽象工厂用于系列创建
  • 装饰器:Python原生支持@decorator语法,支持函数和类装饰器
  • 策略:策略类或函数字典,动态切换算法实现
  • 观察者:Subject维护观察者列表,notify触发更新
  • 命令:封装操作为对象,支持撤销和队列
  • 根据问题类型选择模式,Python动态特性可简化实现

存放路径articles/PYTHON/专家/架构与设计/设计模式在Python.md

📝 发现内容有误?点击此处直接编辑

← 上一篇 Python架构演进与迁移
下一篇 → Python领域驱动设计DDD
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库