单例模式在现实生活中就好比谈恋爱。相信每个人都希望拥有一份纯真的爱情,在自己的人生道路上能有一位与自己携手并进,从一而终的伴侣,俗称真爱!而单例模式在程序中,就是确保一个类只有一个实例,并且提供一个访问它的全局方法。Ensure a class has only one instance,and provide a global point of access to it.
对于程序中单例模式的设计思想得就是保证一个类有且只有一个对象(实例)的一种机制。单例模式用来控制某些事物只允许有一个个体。如果恋爱的过程中想要脚踏两只船,那生活必将翻车。
单例模式的模型抽象
代码框架
单例模式的实现方式有很多种,下面列出几种常见的方式。
1. 重写__new__和__init__方法
在Python类中,__new__负责对象的创建,而__init__负责对象的初始化;__new__是一个类方法,而__init__是一个对象方法。
__new__是我们通过类名进行实例化对象时自动调用的,__init__是在每一次实例化对象之后调用的,__new__方法创建一个实例之后返回这个实例的对象,并将其传递给__init__方法的 self 参数。
Python 中__new__和__init__都是 public 类型的,所以我们需要通过重写__new__和__init__方法来改造对象的创建,从而实现单例模式。
在 Java 和 C++这种静态语言中,实现单例模式的一个最简单的方法就是:将构造函数声明成 private 类型的,再定义一个 getInstance() 的静态方法返回一个对象,并确保 getInstance() 每次返回同一个对象即可。
2. 自定义 metaclass 的方法
在定义自己的类时,我们通过 class CustomClass(metaclass=Singleton2)来显式地指定 metaclass 为 Singleton2。
3. 装饰器的方法
装饰器的实质就是对传进来的参数进行补充,可以在不对原有的类做任何代码变动的前提下增加额外的功能,使用装饰器可以装饰多个类。用装饰器的方式来实现单例模式,通用性非常高,在实际项目中用得非常多。
类图
类图非常简单,只有一个类,类中只有一个方法,getInstance() 的作用就是获取该类的唯一实例。
基于框架的实现
通过上面装饰器的方法,我们知道,在定义通用的装饰器方法之后再用它去修饰一个类,这个类就成了一个单例模式的类,使用起来非常方便。
应用场景
你希望这个类只有一个且只能有一个实例。
项目中的一些全局管理类(Manager)可以用单例模式来实现。
设计单例模式并不复杂,在《人人都懂设计模式》中将各类模式分析的清晰易懂,但不缺乏阅读趣味。上xue.cn,阅读此书,轻松掌握各类开挂模式。
每日一题:
Python 语句''.join(list('hello world!')) 执行的结果是什么?
A 'hello world!'B hello world!C ['hello world!']D ('hello world!')- - - - - - - - - - - - - - -
正确答案:A
list 将字符串拆成以每个字母为单元的列表,join 再将它们连接起来变成字符串