单例模式(Singleton Pattern):保证类仅有一个实例,并提供一个访问它的全局访问点.
下面是单例模式的demo:
1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 __author__ = 'Andy' 5 6 """ 7 大话设计模式 8 设计模式——单例模式(Singleton Pattern):保证类仅有一个实例,并提供一个访问它的全局访问点. 9 (python中模块化的操作,可以代替单例模式,生成一个类的实例作为全局变量,其他地方只引用这个实例就可以实现单例) 10 """ 11 12 #因为__new__在__init__前被执行,利用__new__实现单例 13 14 #创建过的单例带有属性__instance 15 class Singleton1(object): 16 def __new__(cls, *args, **kwargs): 17 if not hasattr(cls,'__instance'): 18 cls.__instance = super(Singleton1, cls).__new__(cls, *args, **kwargs) 19 return cls.__instance 20 21 #利用__dict__来引用同一个字典 22 class Singleton2(object): 23 _state = {} 24 def __new__(cls, *args, **kwargs): 25 ob = super(Singleton2, cls).__new__(cls, *args, **kwargs) 26 ob.__dict__ = cls._state 27 return ob 28 29 #利用元类在创建方法时用__metaclass__来创建 30 class Singleton3(type): 31 32 def __new__(cls, name, bases, dct): 33 if not hasattr(cls, '__instance'): 34 cls.__instance = super(Singleton3, cls).__new__(cls, name, bases, dct) 35 return cls.__instance 36 37 #利用装饰器 38 def singleton4(cls, *args, **kwargs): 39 instances = {} 40 def _single(): 41 if cls not in instances: 42 instances[cls] = cls(*args, **kwargs) 43 return instances[cls] 44 return _single 45 46 47 48 class Myclass1(Singleton1): 49 a = 1 50 51 class Myclass2(Singleton2): 52 a = 2 53 54 class Myclass3(object): 55 __metaclass__ = Singleton3 56 a = 3 57 58 @singleton4 59 class Myclass4(object): 60 a = 4 61 62 if __name__ == "__main__": 63 s1 = Myclass1() 64 s2 = Myclass1() 65 print s1.a,id(s1.a),id(s2.a) # 1 140630246306072 140630246306072 66 67 s3 = Myclass2() 68 s4 = Myclass2() 69 print s3.a,id(s3.a),id(s4.a) # 2 140628399791616 140628399791616 70 71 s5 = Myclass3() 72 s6 = Myclass3() 73 print s5.a,id(s5.a),id(s6.a) # 3 140530304439208 140530304439208 74 75 s7 = Myclass4() 76 s8 = Myclass4() 77 print s7.a,id(s7.a),id(s8.a) # 4 140684486002032 140684486002032
上面类的设计如下图:
单例模式因为Singleton类封装它的唯一实例,这样可以控制客户怎样访问和何时访问它,简单的说就是对唯一实例的受控访问
比如只有第一次被引用的时候才实例化自己,以后都不对自己实例化
作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。