<人人都懂设计模式>-单例模式
2024-10-21 07:32:14
这个模式,我还是了解的。
书上用了三种不同的方法。
class Singleton1: # 单例实现方式1 __instance = None __is_first_init = False def __new__(cls, name): if not cls.__instance: Singleton1.__instance = super().__new__(cls) return cls.__instance def __init__(self, name): if not self.__is_first_init: self.__name = name self.__is_first_init = True def get_name(self): return self.__name tony = Singleton1('Tony') karry = Singleton1('karry') print(tony.get_name(), karry.get_name()) print(id(tony), id(karry)) print(tony == karry) print("=======单例实现方式1========") class Singleton2(type): # 单例实现方式2 def __init__(cls, what, bases=None, dict=None): super().__init__(what, bases, dict) cls._instance = None def __call__(cls, *args, **kwargs): if cls._instance is None: cls._instance = super().__call__(*args, **kwargs) return cls._instance class CustomClass(metaclass=Singleton2): def __init__(self, name): self.__name = name def get_name(self): return self.__name tony = CustomClass('Tony') karry = CustomClass('karry') print(tony.get_name(), karry.get_name()) print(id(tony), id(karry)) print(tony == karry) print("=======单例实现方式2========") def singleton_decorator(cls, *args, **kwargs): instance = {} def wrapper_singleton(*args, **kwargs): if cls not in instance: instance[cls] = cls(*args, **kwargs) return instance[cls] return wrapper_singleton @singleton_decorator class Singleton3: # 单例实现方式2 def __init__(self, name): self.__name = name def get_name(self): return self.__name tony = Singleton3('Tony') karry = Singleton3('karry') print(tony.get_name(), karry.get_name()) print(id(tony), id(karry)) print(tony == karry) print("=======单例实现方式3========")
C:\Python36\python.exe C:/Users/Sahara/PycharmProjects/test1/test.py Tony Tony 39257648 39257648 True =======单例实现方式1======== Tony Tony 39257984 39257984 True =======单例实现方式2======== Tony Tony 39257928 39257928 True =======单例实现方式3======== Process finished with exit code 0
最新文章
- C# Winform 拦截关闭按钮触发的事件
- (转)Java中使用Jedis操作Redis
- Struts2(五):ActionSupport
- css页面点击文字出现蓝色底色去掉方法
- linux:lnmp环境搭建
- Tomcat的测试页打开空白页的解决方法
- 内网能PING通TELNET通不能访问解决
- 自适应SimpsonSimpson积分
- 基于Jmeter的轻量级接口压力测试(一)
- Mysql 根据时间戳按年月日分组统计
- java设计模式—多工厂模式
- [Apio2009][bzoj1179]Atm
- jmap -histo pid 输出的[C [B [I [S methodKlass constantPoolKlass含义
- BZOJ3240 [Noi2013]矩阵游戏 矩阵 快速幂 卡常
- java相对路径、绝对路径及类路径
- SDWebImage之SDWebImageCompat
- Hadoop如何将TB级大文件的上传性能优化上百倍?
- 测试--错误java.lang.Exception: No tests found matching [{ExactMatcher:fDisplayName=select], {ExactMatcher:fDisplayName=select(com.rjj.demo.DemoApplicationTests)]...
- javaScript高级教程(四) 复制对象
- elasticsearch中 refresh 和flush区别