單例模式(singleton pattern)是一種常用的軟體設計模式,該模式的主要目的是確保某乙個類始終只有乙個例項存在。我們都知道,每一次例項化乙個物件,它們之間都是獨立的。但有些應用場景:比如,全域性就希望有乙個實體存在,作為配置項等,也就是希望牽一髮而動全身。
單例模式正好能解決。
classsingleton:
_instance =none
def__new__(cls, *args, **kwargs):
ifnot
cls._instance: # 如果例項不存在
cls._instance = super(singleton,cls).__new__(cls,*args,**kwargs)
return
cls._instance # 否則直接返回
cls._instance
classmyclass(singleton):
pass
mc1 =myclass()
mc2 =myclass()
print(id(mc1),id(mc2))
>>>2316670072480 2316670072480 # 看,共用乙個例項物件
重點:模組只匯入一次。因為模組在第一次匯入時,會生成mysingleton.py.pyc
檔案,當第二次匯入時,就會直接載入.pyc
檔案,而不會再次執行模組**。因此,我們只需把相關的函式和資料定義在乙個模組中,就可以獲得乙個單例物件了。
classmy_singleton(object):
deffoo(self):
print("
foo"
)my_singleton = my_singleton() #
例項化乙個物件
單例模式.py
from mysingleton import my_singleton #匯入模組中的例項物件
(id(my_singleton))
from mysingleton import my_singleton
(id(my_singleton))
>>>2688065271400 # 共用乙個例項物件
2688065271400
區分:
from mysingleton import my_singleton #匯入模組中的類
mc1 =my_singleton()
mc2 =my_singleton()
(id(mc1))
print(id(mc2))
前面匯入模組的是乙個例項物件,那這次匯入的乙個類,它們是否是一樣的呢?答案:不一樣!看清楚,前面,我們匯入是乙個例項物件,因為模組匯入的特殊性,我們都是共用的乙個例項物件。而這次匯入的是類,這樣每次例項化時,都是獨立的。
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...
單例 單例模式
簡單的實現乙個單例 instancetype sharedinstance return instance 真正的單例模式 myclass sharedinstance return instance id allocwithzone nszone zone return nil id copywi...
初識設計模式(1) 單例 工廠 註冊樹
1 單例模式 單例模式是一種常用的軟體設計模式。通過單例模式可以保證系統中乙個類只有乙個例項而且該例項易於外界訪問,從而方便對例項個數的控制並節約系統資源。如果希望在系統中某個類的物件只能存在乙個,單例模式是最好的解決方案。小示例 1 2class database38 public static ...