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

  • 相关阅读:
    Thymeleaf基本知识
    Hibernate学习总结
    oracle学习笔记第三天
    oracle学习笔记第二天
    oracle学习笔记第一天
    Cloudera Hadoop 环境搭建(离线安装)
    SpringBoot搭建基于Apache Shiro+Redis的分布式Session共享功能
    SpringBoot搭建基于Apache Shiro的权限管理功能
    Mybatis基于SqlSession实现CRUD
    Mybatis基于接口注解配置SQL映射器(二)
  • 原文地址:https://www.cnblogs.com/onepiece-andy/p/python-singleton-pattern.html
Copyright © 2011-2022 走看看