Python 设计模式全解析

设计模式是针对软件设计中常见问题的通用解决方案。在 Python 中,我们利用其动态特性,可以用比 Java 更简洁的代码实现这些模式。
代码直戳: https://github.com/faif/python-patterns

一、 创建型模式 (Creational Patterns)

核心目标:处理对象的创建,将系统与对象的创建、组合、表示分离。

1. 工厂方法 (Factory Method)

  • 代码示例:
    def get_serializer(fmt):
        if fmt == "json": return lambda data: f"JSON: {data}"
        if fmt == "xml": return lambda data: f"XML: {data}"
        return str
    # 使用:serializer = get_serializer("json")
  • 优点: 屏蔽对象创建细节,增加新产品只需扩展工厂,不改动调用方。
  • 缺点: 简单场景下会增加代码结构的复杂性。
  • 适用场景: 需要根据配置或环境动态决定实例化哪类对象时。

2. 抽象工厂 (Abstract Factory)

  • 代码示例:
    class DarkTheme: get_bg = lambda self: "黑色"
    class LightTheme: get_bg = lambda self: "白色"
    # 工厂的工厂:统一返回一组相关的对象家族
  • 优点: 确保一系列相关对象能一起工作,保证风格统一。
  • 缺点: 扩展“产品族”非常困难(例如增加一个蓝色主题需要修改所有工厂)。
  • 适用场景: 换肤系统、多数据库驱动支持。

3. 惰性初始化 (Lazy Evaluation)

  • 代码示例:
    class Resource:
        def __init__(self): self._data = None
        @property
        def data(self):
            if self._data is None: 
                print("首次加载数据..."); self._data = [1, 2, 3]
            return self._data
  • 优点: 减少启动开销,按需分配内存。
  • 缺点: 第一次调用时可能会产生明显的延迟。
  • 适用场景: 加载大型文件、建立昂贵的网络连接。

4. 生成器模式 (Builder)

  • 代码示例:
    class Pizza:
        def __init__(self): self.steps = []
    class PizzaBuilder:
        def __init__(self): self.p = Pizza()
        def add_cheese(self): self.p.steps.append("奶酪"); return self
        def add_sauce(self): self.p.steps.append("酱料"); return self
  • 优点: 允许分步创建复杂对象,且相同的创建过程可以创建不同的表示。
  • 缺点: 需要定义多个具体的生成器类。
  • 适用场景: 创建具有多个可选参数的复杂对象。

5. 单例模式 (Singleton)

  • 代码示例:
    class AppConfig:
        _instance = None
        def __new__(cls):
            if not cls._instance: cls._instance = super().__setattr__("_data", {})
            return cls._instance
  • 优点: 节约内存,保证全局状态唯一。
  • 缺点: 违背单一职责原则,在多线程环境下需额外处理锁。
  • 适用场景: 配置管理、数据库连接池。

6. 原型模式 (Prototype)

  • 代码示例:
    import copy
    class Form:
        def clone(self): return copy.deepcopy(self)
  • 优点: 逃避构造函数的约束,直接克隆复杂状态的对象,效率更高。
  • 缺点: 深拷贝复杂对象时容易出现循环引用问题。
  • 适用场景: 游戏中的大量小怪生成、复杂的初始配置备份。

7. 对象池 (Object Pool)

  • 代码示例:
    class ConnectionPool:
        def __init__(self): self.pool = [Conn() for _ in range(5)]
        def borrow(self): return self.pool.pop()
        def return_back(self, conn): self.pool.append(conn)
  • 优点: 显著提高频繁创建/销毁昂贵对象的性能。
  • 缺点: 必须严格管理对象的“归还”逻辑,否则会导致池枯竭。
  • 适用场景: 数据库连接、线程池、网络套接字。

二、 结构型模式 (Structural Patterns)

核心目标:关注类和对象的组合。

8. 装饰器模式 (Decorator)

  • 代码示例:
    def bold(func):
        return lambda: f"<b>{func()}</b>"
    @bold
    def hello(): return "Hello"
  • 优点: 动态扩展功能,比继承更灵活。
  • 缺点: 多个嵌套装饰器会增加调试难度。
  • 适用场景: 日志监控、权限校验。

9. 代理模式 (Proxy)

  • 代码示例:
    class RealImage: 
        def display(self): print("显示图片")
    class ProxyImage:
        def __init__(self): self.real = None
        def display(self):
            if not self.real: self.real = RealImage()
            self.real.display()
  • 优点: 控制访问、延迟加载。
  • 缺点: 在访问者与目标间增加了中间层,可能稍微影响速度。
  • 适用场景: 远程代理、安全控制、智能引用。

三、 行为型模式 (Behavioral Patterns)

核心目标:关注对象间的通信。

10. 迭代器模式 (Iterator)

  • 代码示例:
    # Python 原生支持:实现 __iter__ 和 __next__
    items = [1, 2, 3]
    it = iter(items)
    print(next(it))
  • 优点: 访问集合内容而不暴露内部结构,支持多种遍历方式。
  • 缺点: 对于简单的集合,手动实现迭代器显得多余。
  • 适用场景: 遍历数据库记录、处理大型流式文件。