一個類被設計出來,就意味着它具備某種行爲(方法),屬性(成員變量)。通常狀況下,當咱們想使用這個類時,會使用new 關鍵字,這時候jvm會幫咱們構造一個該類的實例。這麼作會比較耗費資源。python
若是能在jvm啓動時就new好,或者是某一次new好後之後不再用new了,這樣就能節省不少資源了。多線程
這就是單例模式要解決的問題。jvm
要實現一個單例類,須要通過三個步驟:ide
一、私有化構造函數,目的是避免其它類能夠建立這個類的對象;函數
二、在本類中建立惟一實例對象(由於構造函數私有化了,因此單例類的惟一實例對象只能在單例類裏面建立;),使用一個私有靜態的成員變量保存spa
三、對外提供一個公開的靜態的函數供別人獲取這個惟一實例對象線程
1)餓漢式設計
特色:在加載類的同時就建立了這個類的惟一實例;對象
好處:可保證這個類的實例的惟一性;blog
弊端:若是隻是使用這個類,可是暫時不須要它的對象,也會建立惟一實例,形成內存的浪費;
代碼模板:
2)懶漢式:
特色:在第一次調用獲取實例的方法時才建立對象;
好處:第一次調用獲取實例的方法時才建立對象,能夠避免內存的浪費;
弊端:多線程環境下不能保證明例的惟一性;
代碼模板:
上面兩種是從人家博客裏面截圖的,比較清晰的說明了餓漢模式和懶漢模式的區別
1)嚴格控制對惟一的實例的訪問方式(能夠容許有限數量的實例)
2)僅有一個實例,能夠節約系統資源
1)單例模式沒有抽象層,擴展比較困難
2)職責太重,即充當工廠角色,有充當產品角色。
3)若是長期不使用,Java會自動回收,致使下次使用又從新實例化。
1)有且僅有一個單例類實例(沒法經過反序列化從新構建對象)
2)構造函數私有化
3)經過靜態方法或枚舉得到單例類實例
#python實現單例模式
#(1)
class Test: def __new__(cls): if not hasattr(cls,'instance'): cls.instance=super(Test,cls).__new__(cls) return cls.instance obj1=Test() obj2=Test() print(obj1 is obj2) #(2) def singleton(cls): instances={} def getinstance(*args,**kwargs): if cls not in instances: instances[cls]=cls(*args,**kwargs) return instances[cls] return getinstance @singleton class MyClass: a=1 c1=MyClass() c2=MyClass() print(c1==c2)
還有其餘的,我也不想再寫了
一個類被設計出來,就表明它表示具備某種行爲(方法),屬性(成員變量),而通常狀況下,當咱們想使用這個類時,會使用new關鍵字,這時候jvm會幫咱們構造一個該類的實例。而咱們知道,對於new這個關鍵字以及該實例,相對而言是比較耗費資源的。因此若是咱們可以想辦法在jvm啓動時就new好,或者在某一次實例new好之後,之後再也不須要這樣的動做,就可以節省不少資源了。
一個類被設計出來,就表明它表示具備某種行爲(方法),屬性(成員變量),而通常狀況下,當咱們想使用這個類時,會使用new關鍵字,這時候jvm會幫咱們構造一個該類的實例。而咱們知道,對於new這個關鍵字以及該實例,相對而言是比較耗費資源的。因此若是咱們可以想辦法在jvm啓動時就new好,或者在某一次實例new好之後,之後再也不須要這樣的動做,就可以節省不少資源了。
#參考
http://www.imooc.com/article/279430
https://baijiahao.baidu.com/s?id=1619543284145447185&wfr=spider&for=pc
http://www.sohu.com/a/141927148_812245