認識單例模式

2021-10-09 14:22:23 字數 2169 閱讀 2849

保證整個系統中乙個類只有乙個物件的例項,實現這種功能的方式就叫單例模式。
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.對外暴露公共的...