单例模式
来源:互联网 发布:淘宝网鞋柜 编辑:程序博客网 时间:2024/06/05 03:04
以下方法 中只有方法4 最好, 其它都有些问题
# -*- encoding=utf-8 -*-print '----------------------方法1--------------------------'# 方法1 通过重写__new__方法from threading import Lockclass SingleClass(object): lock = Lock() def __init__(self, value): self.value = value def __new__(cls, *args, **kw): if not hasattr(cls, '_instance'): cls.lock.required() if not hasattr(cls, '_instance'): cls._instance = object.__new__(cls, *args) cls.lock.release() return cls._instanceone = SingleClass(2)two = SingleClass(3)print one is two # Trueprint one.value, two.value # 3, 3one.value = 4print one.value, two.value # 4, 4print '----------------------方法2--------------------------'# 方法2 共享属性(所有实例共享同一个状态字典(dict)) 保证不同实例有相同的状态;class Borg(object): _state = {} def __new__(cls, *args, **kw): ob = super(Borg, cls).__new__(cls, *args) ob.__dict__ = cls._state return obclass SingleClass(Borg): def __init__(self, value): self.value = valueone = SingleClass(2)two = SingleClass(3)print one is two # Falseprint two.__dict__ is one.__dict__ # Trueprint one.value, two.value # 3 3one.value = 4print one.value, two.value # 4 4print '----------------------方法3--------------------------'# 方法3: 重写__metaclass__(元类)的call方法class Singleton(type): def __call__(cls, *args, **kwargs): if not hasattr(cls, '_instance'): cls._instance = super(Singleton, cls).__call__(*args, **kwargs) return cls._instanceclass SingleClass(object): __metaclass__ = Singleton def __init__(self, value): self.value = valueone = SingleClass(2)two = SingleClass(3)print one is two # Falseprint one.value, two.value # 2 2one.value = 4print one.value, two.value # 4 4print '----------------------方法4--------------------------'# 方法4: 使用装饰器(decorator)def singleton(cls): instances = {} def _singleton(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return _singleton@singletonclass SingleClass(object): def __init__(self, value): self.value = valueone = SingleClass(2)two = SingleClass(3)print one is two # Trueprint one.value, two.value # 2 2one.value = 4print one.value, two.value # 4 4print '----------------------方法5--------------------------'# 类简单工厂模式class Factory(object): class __SingleClass(object): def __init__(self, value): self.value = value @classmethod def get_one(cls, *args, **kwargs): if not hasattr(cls, '_Factory__instance'): cls.__instance = cls.__SingleClass( *args, **kwargs) return cls.__instanceone = Factory.get_one(2)two = Factory.get_one(3)print one is two # Trueprint one.value, two.value # 2 2one.value = 4print one.value, two.value # 4 4
1 0
- 单例、单例模式
- 单例模式-多线程单例模式
- 单件模式(单例模式)
- 设计模式------单例模式
- 设计模式------单例模式
- 设计模式-单例模式
- 设计模式 - 单例模式
- 设计模式---单例模式
- 设计模式---单例模式
- PHP模式-单例模式
- 【设计模式】单例模式
- 设计模式-单例模式
- 设计模式----单例模式
- 设计模式--单例模式
- 设计模式-单例模式
- 单例模式(单子模式)
- 设计模式-单例模式
- [设计模式] 单例模式
- 报表导出
- 2015寒假总结—做自己
- 103.有问题!!!!Remove Duplicate Letters
- uva 10943 隔板法
- Linux RPM命令
- 单例模式
- Ubuntu安装JDK
- MATLAB图像处理:平面卫星图转换成立体球形图
- Java张孝祥视频 学习笔记 反射
- Android性能优化
- IP地址段计算方法——计算最大广播地址,最小网络地址
- iOS 保存图片到相册
- POJ 1470 Closest Common Ancestors LCA_Tarjan
- Android Studio生成apk