大话设计模式Python实现-单例模式

单例模式(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/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

 

posted @ 2017-11-22 14:51  Andy冉明  阅读(540)  评论(0编辑  收藏  举报