一 简介
单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。
关键点:
某个类只能有一个实例;
它必须自行创建这个实例;
它必须自行向整个系统提供这个实例。
二 实例
1 简单方法
class Singleton:
__instance = None
@classmethod
def get_instance(cls):
if cls.__instance:
return cls.__instance
cls.__instance = Singleton()
return cls.__instance
obj1 = Singleton.get_instance()
print(obj1)
obj2 = Singleton.get_instance()
print(obj2)
obj3 = Singleton.get_instance()
print(obj3)
结果:
<__main__.Singleton object at 0x7f85d7044ac8>
<__main__.Singleton object at 0x7f85d7044ac8>
<__main__.Singleton object at 0x7f85d7044ac8>
2 基于简单方法的变种1
class Singleton(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls, '_instance'):
orig = super(Singleton, cls)
cls._instance = orig.__new__(cls, *args, **kwargs)
return cls._instance
class Foo(Singleton):
pass
obj1 = Foo()
obj2 = Foo()
print(obj1)
print(obj2)
结果:
<__main__.Foo object at 0x7fed34a48c18>
<__main__.Foo object at 0x7fed34a48c18>
3 基于简单方法的变种2
class Singleton(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Singleton, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob
class Foo(Singleton):
pass
obj1 = Foo()
obj2 = Foo()
print(id(obj1.__dict__))
print(id(obj2.__dict__))
结果:
140131036531976
140131036531976
三 应用场景
由上边的实例可以看出,创建对象时,在内存中只保存一份,非常节省内存。然而,我们在什么时候会用到单例模式呢?
1. 数据库连接池
我们可以用单例模式创建一个数据库连接池,每个用户请求都可以用这个公用的数据库连接池来操作数据库。永远使用一个实例对象,从而省去了各个用户分别连接数据库时消耗的时间。
2. tornado的ioloop中的实例