讓類的例項在系統中只有乙個唯一的例項,每一次執行 類名()返回 的物件,記憶體位址相同。
單例設計模式的使用場景:
**站物件
印表機物件
__new__ 的執行順序是在__init__之前,因為__new__執行的是類方法所以在__init__之前,__new__要先分配記憶體空間給物件,然後再把物件的引用給__init__方法。
class singleton(object):
def __init__(self,*args,**kwargs):
print("__init__")
@classmethod
def instance(cls, *args, **kwargs):
if not hasattr(singleton, "_instance"):
print("instance")
singleton._instance = singleton(*args, **kwargs)
return singleton._instance
singleton.instance(())
instance
__init__
class musicplayer:
def __new__(cls, *args, **kwargs):
print("__new__")
def __init__(self):
print("__init__")
player1 = musicplayer()
__new__
如果不把物件引用返回給__init__則只會執行__new__方法,所以把物件引用返回給__init__.
要想建立單例則必須重寫__new__方法。
要記住這個流程:
先判斷有之前有沒有建立例項物件,如果有則繼續用這個例項物件的記憶體的位址,沒有則在記憶體中開闢乙個空間給這個第一次建立的例項物件。
instance = none#物件
def __new__(cls, *args, **kwargs):
if cls.instance is none:#判斷類屬性是否為空物件
cls.instance = super().__new__(cls)#如果是空則呼叫父類方法,為第乙個物件建立記憶體空間
return cls.instance#返回類屬性儲存的物件引用給__init__
def __init__(self):
player1 = musicplayer()
print(player1)
player2 = musicplayer()
print(player2)
<__main__.musicplayer object at>
<__main__.musicplayer object at>
重寫__new__方法後,建立的物件都指向唯一乙個記憶體位址。
單例只初始化一次:
就是在設定乙個類屬性init_flag = false,在__init__方法下判斷init_flag是否為true,如果是true則return non,不是就執行第一次初始化的函式,在把init_flag = true。
class musicplayer:
instance = none#
init_flag = false
def __new__(cls, *args, **kwargs):
if cls.instance is none:#判斷類屬性是否為空物件
cls.instance = super().__new__(cls)#如果是空則呼叫父類方法,為第乙個物件建立記憶體空間
return cls.instance#返回類屬性儲存的物件引用給__init__
def __init__(self):
if musicplayer.init_flag == true:
return
musicplayer.init_flag = true
<__main__.musicplayer object at>
<__main__.musicplayer object at>
認識單例模式
保證整個系統中乙個類只有乙個物件的例項,實現這種功能的方式就叫單例模式。1 單例模式節省公共資源 比如 大家都要喝水,但是沒必要每人家裡都打一口井是吧,通常的做法是整個村里打乙個井就夠了,大家都從這個井裡面打水喝。對應到我們計算機裡面,像日誌管理 印表機 資料庫連線池 應用配置。2 單例模式方便控制...
認識設計模式(一) 單例模式(1)
四 優缺點分析 五 總結 餓漢式 靜態常量 餓漢式 靜態 塊 懶漢式 執行緒不安全 懶漢式 執行緒安全,同步方法 懶漢式 執行緒安全,同步 塊 雙重檢查靜態內部類列舉構造器私有化 防止new再獲取物件 類的內部建立物件 向外暴露乙個靜態的公共方法,getinstance,這個唯一的方法用來獲取物件例...
單例模式 單例模式
餓漢式 急切例項化 public class eagersingleton 2.宣告靜態成員變數並賦初始值 類初始化的時候靜態變數就被載入,因此叫做餓漢式 public static eagersingleton eagersingleton new eagersingleton 3.對外暴露公共的...