保證整個系統中乙個類只有乙個物件的例項,實現這種功能的方式就叫單例模式。
1、單例模式節省公共資源
比如:大家都要喝水,但是沒必要每人家裡都打一口井是吧,通常的做法是整個村里打乙個井就夠了,大家都從這個井裡面打水喝。
對應到我們計算機裡面,像日誌管理、印表機、資料庫連線池、應用配置。
2、單例模式方便控制
就像日誌管理,如果多個人同時來寫日誌,你一筆我一筆那整個日誌檔案都亂七八糟,如果想要控制日誌的正確性,那麼必須要對關鍵的**進行上鎖,只能乙個乙個按照順序來寫,而單例模式只有乙個人來向日誌裡寫入資訊方便控制,避免了這種多人干擾的問題出現。
1.模組
class myseling:
def foo(self):
pass
sing = myseling()
print(sing)
從num.py匯入呼叫sing模組
from num1 import sing
sing
我們知道,裝飾器可以動態的修改乙個類或函式的功能。這裡,我們也可以使用裝飾器來裝飾某個類,使其只能生成乙個例項:
def singleton(cls):
instance = {}
def getinstance(*args,**kwargs):
if cls not in instance:
instance[cls] =cls(*args,**kwargs)
return instance[cls]
return getinstance
@singleton
def myinstance():
a=1c1 = myinstance()
c2 = myinstance()
print(c1==c2) # true
這裡表示instance初始化
如果不存在,則會將 cls 作為 key,cls(*args, **kw) 作為 value 存到 instances 中,每次呼叫都是一致的,否則,直接返回 instances[cls]。
class singleton(object):
def __init__(self):
pass
def __new__(cls):
# 關鍵在於這,每一次例項化的時候,我們都只會返回這同乙個instance物件
if not hasattr(cls, 'instance'):
cls.instance = super(singleton, cls).__new__(cls)
return cls.instance
obj1 = singleton()
obj2 = singleton()
print(obj1==obj2) # true
或者
class musicplayer(object):
# 定義乙個類屬性,用於記錄單例物件的引用
instance = none
# 記錄是否執行初始化動作
init_flag = false
def __new__(cls, *args, **kwargs):
# 判斷類屬性是否已經被賦值
if cls.instance is none:
cls.instance = super().__new__(cls)
# print(cls.instance)
# 返回類屬性的單例引用
return cls.instance
def __init__(self):
if not musicplayer.init_flag:
musicplayer.init_flag = true
player = musicplayer()
player1 = musicplayer()
print(player)
print(player1)
執行後
<__main__.musicplayer object at 0x0000029ef636a708>
<__main__.musicplayer object at 0x0000029ef636a708>
認識單例模式 new init
讓類的例項在系統中只有乙個唯一的例項,每一次執行 類名 返回 的物件,記憶體位址相同。單例設計模式的使用場景 站物件 印表機物件 new 的執行順序是在 init 之前,因為 new 執行的是類方法所以在 init 之前,new 要先分配記憶體空間給物件,然後再把物件的引用給 init 方法。cla...
認識設計模式(一) 單例模式(1)
四 優缺點分析 五 總結 餓漢式 靜態常量 餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全,同步方法 懶漢式 執行緒安全,同步 塊 雙重檢查靜態內部類列舉構造器私有化 防止new再獲取物件 類的內部建立物件 向外暴露乙個靜態的公共方法,getinstance,這個唯一的方法用來獲取物件例...
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...