一、何为单例模式
单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点。
实现某个类只有一个实例的途径:
1、让一个全局变量使得一个对象被访问,但是他不能防止外部实例化多个对象。
2、让类自身保存他的唯一实例,这个类可以保证没有其他实例可以被创建。
多线程时的单例模式:加锁-双重锁定
饿汉式单例类:在类被加载时就将自己实例化(静态初始化)。其优点是躲避了多线程访问的安全性问题,缺点是提前占用系统资源。
懒汉式单例类:在第一次被引用时,才将自己实例化。避免开始时占用系统资源,但是有多线程访问安全性问题。
二、如何实现单例模式
实现单例模式本人总结了三种方法:
1、文件导入,当文件被当做模块被导入时,只执行一遍,因此一个类,只有一个实例,故此可为单例模式。
import test #模块被导入时,自动执行test,创建唯一实例对象。
2、类方法,创建单例模式。
class Foo(object): _instance = None def __init__(self): pass @classmethod def get_instance(cls): if cls._instance: return cls._instance else: obj = cls() cls._instance = obj return obj obj1 = Foo.get_instance() obj2 = Foo.get_instance() # 用id(), ==, is检测,看是否为同一对象。 print(id(obj1)) # 39514520 print(id(obj2)) # 39514520 print(obj1 == obj2) # True print(obj1 is obj2) # True
3、__new__方法,比方法二要好,采用的还是传统的实例方法,即类名+()。避免了繁琐的文档说明。
class Foo(object): _instance = None def __init__(self): pass def __new__(cls, *args, **kwargs): if cls._instance: return cls._instance else: obj = object.__new__(cls,*args,**kwargs) cls._instance = obj return obj # 还是传统的实例化对象方法。 obj1 = Foo() obj2 = Foo() # 用id() , == , is 检测,看是否为同一对象。 print(id(obj1)) # 39514520 print(id(obj2)) # 39514520 print(obj1 == obj2) # True print(obj1 is obj2) # True
期待更新……