四種方式實現單例模式

2021-09-12 02:28:14 字數 1544 閱讀 8794

乙個類中只有乙個例項,除此外沒有其他的例項模式,有三種特性:

構造器不可被外部建立

限制了外部的訪問方式

內部保證例項唯一

現在來介紹四種方式:

public class singletonpattern01 

public static singletonpattern01 getsingletonparrern()

return singletonparrern;

}}

懶漢式就是將自己類的屬性和構造方法設為私有,然後將屬性設定為靜態的,再構造乙個靜態的方法 singletonpattern01,以供在其他類呼叫,在此靜態方法中,第一次執行時,用 if 條件判斷奔雷的屬性 singletonparrern 是否為 null,如果為null,就新建乙個例項然後賦值給自己的屬性,後來的就判斷 singletonparrern 不等於null,然後直接返回乙個singletonparrern (第一次就建立好的例項),以此達到單例模式的效果。

public class singletonpattern02 

public static singletonpattern02 getsingletonpattern()

}

餓漢式單例模式大致上與上邊的懶漢式相同,但餓漢式直接在初始化屬性的時候就建立了乙個物件然後賦值給了自己的屬性,然後通過靜態方法返回屬性,達到實現單例模式的效果。

public class dclsingletonpattern 

public static dclsingletonpattern getdclsingletonpattern()}}

return dclsingletonpattern;

}}

上述**,以懶漢模式為例,解決了多執行緒建立例項的問題,因為不管是懶漢模式,還是餓漢模式,都有可能多個執行緒執行這個靜態方法,從而建立出多個例項,而為**加鎖,就很好地解決了這一問題。

在靜態方法中,第乙個 if 迴圈先判斷 dclsingletonpattern 是否為空,因為多個執行緒同時執行這個方法的情況畢竟是少數情況,大多數時間還是會挨個執行,先做判斷是否為空,如果不為空就不繼續執行,這樣就提高了執行效率。如果為空,就先將建立例項的**鎖住,保證執行緒挨個執行,然後再用第二個 if 語句判斷 dclsingletonpattern 是否為空,如果是,就建立乙個例項賦值給 dclsingletonpattern ,然後後邊的執行緒就不符合第二個 if 判斷要求,從而實現了只建立乙個例項的效果。

/** * 列舉式單例,列舉的建立由jvm保證,

因此不會出現併發問題,

構造器自動私有,外部不能建立,

只能引用 * 用法為:singletonenum.instance.dosomething(); */

public enum singletonenum

public static void main(string args)

}

希望以上的方法能對各位看客有所幫助,如有錯誤,請指正,謝謝。

單例模式的四種實現方式

單例模式 多次例項化的結果指向同一例項 一,單例模式實現方式一 import settings class mysql instance none def init self,ip,sport self.ip ip self.port port classmethod def from conf c...

單例設計模式的四種實現方式

單例設計模式的三個要求 只能有乙個例項 必須自行建立自己的唯一例項 要對外提供該例項 方法一 餓漢式直接建立例項物件,不管你是否需要這個物件都會去建立 方法一 單例模式的實現 餓漢式,執行緒安全 但效率比較低 public class singleton1 提供對外使用的唯一例項 public st...

單例的四種實現方式

單例的實現方式 1.餓漢式 顧名思義,已載入類就會建立單例。2.懶漢式 顧名思義,只有使用單例的時候,才給載入 3.靜態內部類 推薦 通過再單例實現類中,增加靜態內部類,在靜態內部類中實現單例,與餓漢式不同的時,因為是內部靜態類的靜態屬性,只有使用的時候才會建立單例。4.列舉 實現 將要實現的單例的...