广告
您当前的位置: 首页 >  技术 >  Python

Python 深入浅出:三大核心设计模式的经典实现与实战场景

作者:admin 时间:2026-06-28 阅读数:1人阅读

在软件开发中,设计模式(Design Patterns)是前人面对常见设计问题总结出的最佳解决方案。设计模式并不是具体的代码,而是一种设计思想。

由于 Python 是一门高度动态、支持多范式(面向对象、函数式)的语言,这使得许多在 C++ 或 Java 中需要复杂类结构实现的设计模式,在 Python 中可以变得异常轻量和优雅。

本文将带您深入剖析 单例模式工厂模式观察者模式 这三大核心设计模式在 Python 中的经典实现与实战场景。


一、 单例模式(Singleton Pattern)

1. 核心意图

确保一个类在整个应用程序生命周期中,有且仅有一个实例,并提供一个全局访问点。 * 经典场景:数据库连接池、日志记录器(Logger)、全局配置管理器。

2. Python 经典实现方式:使用 __new__

在 Python 中,__new__ 是真正创建实例的魔法方法,重写它可以非常干净地实现单例:

class DatabaseConnection:
    _instance = None  # 存储唯一的单例对象

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            # 调用父类 object 的 __new__ 来创建真实的实例
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self, db_name):
        # 注意:__init__ 每次调用 DatabaseConnection() 时仍会执行,
        # 实际开发中可以通过标志位来防止重复初始化
        self.db_name = db_name

# 测试单例
db1 = DatabaseConnection("production_db")
db2 = DatabaseConnection("test_db")

print(db1 is db2)       # 输出: True (说明是同一个内存对象)
print(db1.db_name)      # 输出: test_db

二、 工厂模式(Factory Pattern)

1. 核心意图

对象的创建对象的使用进行解耦。调用者不需要知道具体类的类名和创建细节,只需通过“工厂”传入参数,即可获得所需的产品对象。 * 经典场景:支付网关选择(微信/支付宝/银联)、数据格式解析器选择(JSON/XML/YAML)。

2. Python 经典实现:简单工厂(Simple Factory)

借助于 Python 中“函数是一等公民”和动态反射的特性,工厂模式可以写得非常扁平:

class WeChatPay:
    def pay(self, amount):
        return f"使用微信支付了 {amount} 元"

class AliPay:
    def pay(self, amount):
        return f"使用支付宝支付了 {amount} 元"

class PaymentFactory:
    _providers = {
        "wechat": WeChatPay,
        "alipay": AliPay
    }

    @classmethod
    def get_payment_handler(cls, provider_name):
        provider_class = cls._providers.get(provider_name.lower())
        if not provider_class:
            raise ValueError(f"未知的支付渠道: {provider_name}")
        return provider_class()  # 实例化产品并返回

# 使用工厂
handler = PaymentFactory.get_payment_handler("alipay")
print(handler.pay(100))  # 输出: 使用支付宝支付了 100 元

三、 观察者模式(Observer Pattern)

1. 核心意图

定义了一种一对多的依赖关系。当一个对象(被观察者/主题 Subject)的状态发生改变时,所有依赖于它的对象(观察者 Observer)都会得到通知并被自动更新。它也是发布-订阅(Pub-Sub)模式的雏形。 * 经典场景:股票行情订阅、后台订单状态变更通知(发送短信+发送邮件+扣减库存)。

2. Python 经典实现:主题与观察者协作

# 观察者接口/基类
class Observer:
    def update(self, message):
        pass

# 具体观察者:短信模块
class SMSNotifier(Observer):
    def update(self, message):
        print(f"【短信通知】收到最新状态: {message}")

# 具体观察者:邮件模块
class EmailNotifier(Observer):
    def update(self, message):
        print(f"【邮件通知】您的订阅已更新: {message}")

# 被观察的主题
class JobMarket:
    def __init__(self):
        self._observers = []  # 记录所有订阅者

    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, message):
        # 状态变更,通知所有观察者
        for observer in self._observers:
            observer.update(message)

# 实战运行
market = JobMarket()
sms_user = SMSNotifier()
email_user = EmailNotifier()

# 订阅
market.attach(sms_user)
market.attach(email_user)

# 市场发布新职位 -> 自动触发所有通知
market.notify("Python 开发工程师 - 25K/月")

四、 总结

  1. 单例模式:在 Python 中除了 __new__,直接使用模块导入(Module Import)也是天生的单例(因为 Python 模块只在第一次导入时编译并运行一次)。
  2. 工厂模式:通过解耦创建和使用,符合“开闭原则”。后续新增产品时只需扩充工厂映射表,无需修改原有调用逻辑。
  3. 观察者模式:实现了发布者与订阅者之间的松耦合,非常适合用于处理事件驱动的业务流。

根据项目复杂度,合理挑选并精简设计模式的实现,能让您的 Python 代码结构更加健壮、更易于测试和维护!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

admin

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信