前言
什么是单例模式
- 指一个类只有一个实例,且该类能自行创建这个实例的一种创建型设计模式。
- 使用目的:确保在整个系统中只能出现类的一个实例,即一个类只有一个对象。对于频繁使用的对象,"忽略"创建时的开销。
- 特点:
- 单例类只有一个实例对象;
- 该单例对象必须由单例类自行创建;
- 单例类对外提供一个访问该单例的全局访问点;
如何保证实例的唯一性
那么,如何保证实例的唯一性?
Java 的解决方案之一
对于 Java 来说,要确保类的构造方法是私有的,使用 static final 的私有成员变量存放这个唯一实例。我们还要提供一个获取实例的接口(由于我们要通过类名获取实例,所以接口方法是 static 的)。实现如下:
Java
public class Singleton {
private static final Singleton instance=new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
我们知道,对于 static 的变量,类所有的实例都可以共享这个变量,我们可以直接通过类名来访问它。再使用 final 修饰这个变量,使得它不能再被改变。
Python 的解决方案之一
以下为 Python 使用装饰器实现的单例模式。这里将不可变的类地址存放在了 dict 中,值为那个唯一的实例。
python
def Singleton(cls):
_instance = {}
def getInstance(*args, **kwargs):
if cls not in _instance:
_instance[cls] = cls()
return _instance[cls]
return getInstance
@Singleton
class test_singleton:
def __init__(self):
pass
def main():
class1 = test_singleton()
class2 = test_singleton()
print('class1 id: {}, class2 id: {}'.format( id(class1), id(class2)))
print(class1 == class2)
main()
# class1 id: 1814844368152, class2 id: 1814844368152
# True
参考
本文由博客群发一文多发等运营工具平台 OpenWrite 发布