鱼C论坛

 找回密码
 立即注册
查看: 1240|回复: 6

[技术交流] 我又浪回来了,Pyhton设计模式之实现单例模式的N种方法

[复制链接]
发表于 2019-1-27 09:35:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 °蓝鲤歌蓝 于 2019-1-27 10:42 编辑

各位小伙伴去面试时很有可能会被问到单例模式如何实现,现在就一起来看看吧。

  1. # -*-coding:utf-8-*-

  2. __Author__ = "Mr.D"
  3. __Date__ = '2019\1\27 0027 7:36'

  4. # __new__ 实现单例
  5. class Singleton():
  6.     _instance = None

  7.     def __new__(cls, *args, **kwargs):
  8.         if not cls._instance:
  9.             cls._instance = super(Singleton, cls).__new__(cls)
  10.         return cls._instance


  11. s1 = Singleton()
  12. s2 = Singleton()
  13. print(s1 is s2)


  14. # 装饰器实现单例
  15. def Single(cls):
  16.     _instance = {}

  17.     def inner():
  18.         if cls not in _instance:
  19.             _instance[cls] = cls()

  20.         return _instance[cls]

  21.     return inner


  22. @Single
  23. class Singleton1():
  24.     pass


  25. s1 = Singleton1()
  26. s2 = Singleton1()
  27. print(s1 is s2)


  28. # 元类实现单例
  29. class Metaclass(type):
  30.     _instance = {}

  31.     def __call__(cls, *args, **kwargs):
  32.         if cls not in cls._instance:
  33.             cls._instance[cls] = super().__call__()

  34.         return cls._instance[cls]


  35. class Singleton2(metaclass=Metaclass):
  36.     pass


  37. s1 = Singleton2()
  38. s2 = Singleton2()
  39. print(s1 is s2)


  40. # 类方法实现单例
  41. class Singleton3():
  42.     _instance = None

  43.     @classmethod
  44.     def getInstance(cls):
  45.         if not cls._instance:
  46.             cls._instance = Singleton3()
  47.         return cls._instance


  48. s1 = Singleton3.getInstance()
  49. s2 = Singleton3.getInstance()
  50. print(s1 is s2)


  51. # 特殊的单例:单态模式
  52. class Singleton4():
  53.     _shared_state = {}

  54.     def __new__(cls, *args, **kwargs):
  55.         obj = super().__new__(cls, *args, **kwargs)
  56.         obj.__dict__ = cls._shared_state
  57.         return obj


  58. s1 = Singleton4()
  59. s2 = Singleton4()
  60. s1.x = 5
  61. print(s2.x)


  62. # 类装饰器实现单例
  63. class Single1():
  64.     def __init__(self, cls):
  65.         self._cls = cls
  66.         self._instance = {}

  67.     def __call__(self, *args, **kwargs):
  68.         _cls = self._cls
  69.         _instance = self._instance
  70.         print(_instance)
  71.         if _cls not in _instance:
  72.             print(f'myinstance is {_instance}')
  73.             _instance[self._cls] = _cls()

  74.         return _instance[self._cls]


  75. class Singleton5():
  76.     pass

  77. s1 = Singleton4()
  78. s2 = Singleton4()
  79. print(s1 is s2)
复制代码


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-1-27 09:37:57 | 显示全部楼层
有不明白的可以在评论里详细说明,我会统一回复。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-27 10:31:49 | 显示全部楼层
666,只写过第一种,学习一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-1-29 09:19:32 | 显示全部楼层
应用场景是什么,,从来没接触过
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-21 21:49:13 | 显示全部楼层
塔利班 发表于 2019-1-29 09:19
应用场景是什么,,从来没接触过

资源共享的场景,比如日志文件或者应用配置文件等。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-21 22:04:41 | 显示全部楼层
°蓝鲤歌蓝 发表于 2019-2-21 21:49
资源共享的场景,比如日志文件或者应用配置文件等。

面试如何
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-26 17:55:35 | 显示全部楼层
记号一下,现在看着还是很累啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 06:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表