设计模式

Last updated 14 days ago

原文链接:http://www.oschina.net/question/107361_25331

单例模式

Python 的单例模式最好不要借助类(在 Java 中借助类是因为 Java 所有代码都要写在类中),而是通过一个模块来实现。一个模块的模块内全局变量、模块内全局函数,组合起来就是一个单例对象了。

模板方法模式

这个可以像其他语言一样实现,但是如果要遵循鸭子类型原则的话,应该删除公有的抽象父类(或接口),从而追求灵活性。

工厂方法模式、多例模式

这个也不用借助类,直接写一个全局函数作为工厂函数即可。因为 Python 中实例化是通过 call 类来完成的,现在改成 call 工厂函数,对客户抠码者是透明的。(从这点我表示理解 Python 没有 new 操作符的好处了,使用通用的 call 定义,正交性极强)

装饰器模式、代理模式

这个接触过 Python 就不会不知道了,Python 内置的 decorator 语法如此著名。装饰器模式和代理模式都可以通过这种方式完成。另外一种是对对象的装饰或代理,这个也不需要按照契约编程的风格,让代理对象实现被代理对象的抽象。一切动态代理,只需要通过重载属性访问操作符,神马都简单了(和 PHP 通过 get、set、__call 来实现动态代理很类似)。

原型模式

这个在 Python 中实现的不是那么爽快,需要调用 copy 来克隆原型对象。但是其实有另一种实现方式:之所以使用原型模式,是因为对象初始化需要较大开销。我们只需要保存初始化的结果,并在产生新对象的时候赋予新对象即可。所以,通过元类控制对象被创建的过程,来实现原型模式,也是一种选择。