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

  • 相关阅读:
    C++ 值传递、指针传递、引用传递
    typedef与#define的区别
    const与#define的区别
    头文件重复引用
    多态
    ng双向数据绑定
    angular响应式编程
    angular的一些问题
    npm install 权限的问题
    typescript的入门
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-singleton-pattern.html
Copyright © 2020-2023  润新知