单例模式(Singleton Pattern):保证类仅有一个实例,并提供一个访问它的全局访问点.

下面是单例模式的demo:

 #!/usr/bin/env python
# -*- coding:utf-8 -*- __author__ = 'Andy' """
大话设计模式
设计模式——单例模式(Singleton Pattern):保证类仅有一个实例,并提供一个访问它的全局访问点.
(python中模块化的操作,可以代替单例模式,生成一个类的实例作为全局变量,其他地方只引用这个实例就可以实现单例)
""" #因为__new__在__init__前被执行,利用__new__实现单例 #创建过的单例带有属性__instance
class Singleton1(object):
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'__instance'):
cls.__instance = super(Singleton1, cls).__new__(cls, *args, **kwargs)
return cls.__instance #利用__dict__来引用同一个字典
class Singleton2(object):
_state = {}
def __new__(cls, *args, **kwargs):
ob = super(Singleton2, cls).__new__(cls, *args, **kwargs)
ob.__dict__ = cls._state
return ob #利用元类在创建方法时用__metaclass__来创建
class Singleton3(type): def __new__(cls, name, bases, dct):
if not hasattr(cls, '__instance'):
cls.__instance = super(Singleton3, cls).__new__(cls, name, bases, dct)
return cls.__instance #利用装饰器
def singleton4(cls, *args, **kwargs):
instances = {}
def _single():
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return _single class Myclass1(Singleton1):
a = 1 class Myclass2(Singleton2):
a = 2 class Myclass3(object):
__metaclass__ = Singleton3
a = 3 @singleton4
class Myclass4(object):
a = 4 if __name__ == "__main__":
s1 = Myclass1()
s2 = Myclass1()
print s1.a,id(s1.a),id(s2.a) # 1 140630246306072 140630246306072 s3 = Myclass2()
s4 = Myclass2()
print s3.a,id(s3.a),id(s4.a) # 2 140628399791616 140628399791616 s5 = Myclass3()
s6 = Myclass3()
print s5.a,id(s5.a),id(s6.a) # 3 140530304439208 140530304439208 s7 = Myclass4()
s8 = Myclass4()
print s7.a,id(s7.a),id(s8.a) # 4 140684486002032 140684486002032

上面类的设计如下图:

单例模式因为Singleton类封装它的唯一实例,这样可以控制客户怎样访问和何时访问它,简单的说就是对唯一实例的受控访问

比如只有第一次被引用的时候才实例化自己,以后都不对自己实例化

作者:Andy
出处:http://www.cnblogs.com/onepiece-andy/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

最新文章

  1. java int与integer的区别
  2. 微信公众平台 Premature end of file
  3. 蓝桥杯——FJ字符串
  4. .NET中ToString()的用法
  5. BeautifulSoup解析非标准HTML的问题
  6. c语言libcurl 使用实例get/post方法+c语言字符串处理
  7. python命令行参数处理
  8. Linux Ubuntu 内核升级
  9. 一.初识java
  10. 使用 ASP.NET Core MVC 创建 Web API(四)
  11. 【原创】从Rest到Graphql
  12. AddressSanitizer简介
  13. iOS----------计算一段代码执行时间
  14. H5 video标签的第二种格式
  15. phpstorm 的.idea 目录加入.gitignore无效的解决方法
  16. protobuf 更新消息和扩展,包
  17. python 机器学习多项式回归
  18. 小米路由Mini刷Breed, 潘多拉和LEDE
  19. php模拟post提交数据,用处很多,可用来网站的采集,登陆等等
  20. vijos p1768 数学

热门文章

  1. CentOS连接Wifi
  2. [Linux]centos下安装memcached
  3. 反转字符串中的单词 III
  4. [译]Vulkan教程(08)逻辑设备和队列
  5. C++之重载覆盖和隐藏
  6. Python中容易忽视的知识点
  7. 关于大数据T+1执行流程
  8. 面试知识点 html css(经常更新)
  9. redis的embstr编码
  10. Spark家族:Win10系统下搭建Scala开发环境