1. 程式人生 > 其它 >單例類

單例類

單例類設計模式

常見的設計模式:單例設計模式,工廠設計模式,代理模式,裝飾者模式等

單例: 一個類只能建立一個物件

特點:全域性唯一,允許更改
優點:節省記憶體,避免資源重用
缺點:與單一職責衝突,只關心邏輯內部,不管外部結構的變化
應用場景: windows系統的回收站 只能有一個,工作管理員只能開啟一個;多執行緒;連線資料庫
 1 # 實現方式1
 2 class Person(object):
 3 __instance = None
 4 
 5 def __new__(cls, *args, **kwargs):
 6 if not cls.__instance: # 如果instance為空
7 cls.__instance = super().__new__(cls) # 將例項的物件新增到instance裡 8 return cls.__instance # 如果不為空,直接返回instance 9 10 def __init__(self,name,age): 11 self.name = name 12 self.age = age 13 14 15 p1 = Person('xiaoming',19) 16 p2 = Person('xiaohong',23) 17 print(id(p1),id(p2)) 18 19 print(p1.name) 20 print
(p2.name) 21 22 23 24 25 # 實現方式2(裝飾器的方式) 26 def singleton(cls): # cls --> Person 27 instance = None 28 29 def get_instance(*args, **kwargs): 30 nonlocal instance 31 if not instance: 32 instance = cls(*args, **kwargs) 33 return instance # 呼叫init 34 return get_instance 35 36 37 @singleton 38
class Person(object): 39 def __init__(self,name,age): 40 self.name = name 41 self.age = age 42 43 44 p1 = Person('xiaoming',18) 45 p2 = Person('xiaohong',39) 46 print(id(p1),id(p2)) 47 48 49 # 實現方式3(元類的方式實現單例) 50 class SingletonMeta(type): 51 def __init__(cls,*args,**kwargs): 52 cls.__instance = None 53 super().__init__(*args, **kwargs) 54 55 def __call__(cls, *args, **kwargs): 56 if cls.__instance is None: 57 cls.__instance = super().__call__(*args,**kwargs) 58 return cls.__instance 59 60 61 class Person(metaclass=SingletonMeta): 62 def __init__(self,name): 63 self.name = name 64 65 66 p1 = Person('xiaoming') 67 p2 = Person('xiaohong') 68 print(p1.name) 69 print(p2.name)