设计模式

Author:王蒙
Tags:Python, 设计模式
abstract:python 非常灵活,有的设计模式没有必要(可以看成 Python 自带这些模式)。

Audience

Python 开发

Prerequisites

熟悉常见的设计模式

Problem

  • 单例(Singleton)
  • 适配器(Adapter)
  • Facade
  • Proxy
  • Visitor
  • Template
  • Mixin

Solution

Singleton

相对于实现 Singleton, Python 更适合使用 Borg/MonoState 模式(就是让所有该类的对象,都有相同的状态)。Singleton 和 Borg 都可以使用类的 __new__ 方法实现。

在 Python 中,为什么 Borg 比 Singelton 常用?

要实现可以继承的 Singleton 比较麻烦(需要用到 metaclass)。而要实现可继承的 Borg 直接实现 __new__ 即可,所以 Borg 用的比较多。

如果不用于继承,又要实现 Singelton, 直接使用模块级的变量和函数,即可。根本用不着实现 Singleton。这两个原因导致,Python几乎用不着 Singleton。

Composite

不管哪种编程语言,与继承相比优先选择 Composite 模式。

Mixin

Python 中多重继承优先选择 Mixin。

Adapter

可以认为 Python 自带了 Adapter, 因为 Python 采用了 Ducking Type 的模式,只要你有这个动作,就认为你是这个类。

所以我们要把 A 类配成 B 类,只要实现相应的方法就行,别的啥不用做(比如不用继承自 B 类)。

Ducking Type 的解释是: If you walks like a duck and talks like a duck, then it’s a duck!

Proxy

提供一个中间件,管控访问。比如之前的 url_cache。

Facade

__init__.py 中常见 import 语句,通过这些 import 语句,python 包定义了自己对外的接口。这就相当于是实现了 Facade 模式。

Observer

Visitor

Template

Reference

  • effect python
  • Expert Python Programming