国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計(jì)模式之單例設(shè)計(jì)模式

這篇具有很好參考價(jià)值的文章主要介紹了設(shè)計(jì)模式之單例設(shè)計(jì)模式。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、單例設(shè)計(jì)模式

就是一個(gè)類(lèi)只允許創(chuàng)建一個(gè)對(duì)象,那么我們稱(chēng)該類(lèi)為單例類(lèi),這種設(shè)計(jì)模式我們稱(chēng)為單例模式。

二、為什么使用單例模式

資源共享:有些類(lèi)擁有共享的資源,例如數(shù)據(jù)庫(kù)連接池、線(xiàn)程池、緩存等。使用單例模式確保只有一個(gè)實(shí)例,避免資源浪費(fèi)和競(jìng)爭(zhēng)條件。

線(xiàn)程安全:?jiǎn)卫J娇梢杂脕?lái)保證多線(xiàn)程環(huán)境下只有一個(gè)實(shí)例,從而避免競(jìng)爭(zhēng)條件和不一致性。

避免全局變量:使用單例模式可以減少全局變量的數(shù)量,從而降低了不同部分之間的耦合。這有助于使代碼更加可維護(hù)和可測(cè)試。

全局訪(fǎng)問(wèn)點(diǎn):?jiǎn)卫J教峁┝艘粋€(gè)全局的訪(fǎng)問(wèn)點(diǎn),使得其他對(duì)象可以輕松地獲取該實(shí)例,而無(wú)需創(chuàng)建多個(gè)實(shí)例或傳遞實(shí)例引用。這對(duì)于配置管理、日志記錄、事件管理等非常有用。

三、如何實(shí)現(xiàn)單例

常見(jiàn)的單例設(shè)計(jì)模式有以下五種:

1、餓漢式

2、懶漢式

3、雙重檢查鎖

4、靜態(tài)內(nèi)部類(lèi)

5、枚舉

我們?cè)诰帉?xiě)以上五種單例代碼的時(shí)候需要注意以下幾點(diǎn):

1、構(gòu)造器私有化

2、暴露一個(gè)公共方法獲取單例對(duì)象

3、是否考慮線(xiàn)程安全

4、是否考慮加載時(shí)間

對(duì)于1、2兩點(diǎn)來(lái)說(shuō),我常常是這樣想的,一個(gè)單例類(lèi)要有兩個(gè)private、兩個(gè)static。構(gòu)造器和對(duì)象必須用private修飾,對(duì)象和獲取對(duì)象的方法必須用static修飾。

注:1、將對(duì)象定義為static的主要原因有兩個(gè),其一是確保只有一個(gè)實(shí)例可以被全局訪(fǎng)問(wèn)。static成員變量是屬于類(lèi)而不是實(shí)例的,這意味著不管創(chuàng)建多少個(gè)類(lèi)的實(shí)例,它們都共享相同的static成員變量。這對(duì)于單例模式非常重要,因?yàn)閱卫暮诵哪繕?biāo)是確保只有一個(gè)實(shí)例存在。其二是返回對(duì)象的方法是靜態(tài)的,靜態(tài)方法不能訪(fǎng)問(wèn)非靜態(tài)成員變量。

我們先來(lái)看第一個(gè)單例模式的代碼

四、餓漢式

餓漢式的實(shí)現(xiàn)方式比較簡(jiǎn)單。具體的代碼實(shí)現(xiàn)如下:

public class EagerSingleton {

    private final static EagerSingleton instance = new EagerSingleton();

    private EagerSingleton() {}

    public static EagerSingleton getInstance(){
        return instance;
    }
}

從上述代碼可以看出,在類(lèi)加載的時(shí)候,instance 靜態(tài)實(shí)例就已經(jīng)創(chuàng)建并初始化好了,所以,instance 實(shí)例的創(chuàng)建過(guò)程是線(xiàn)程安全的。如果不需要延遲加載,并且確保在多線(xiàn)程環(huán)境下只有一個(gè)實(shí)例存在,餓漢式單例是一種有效的選擇。

五、懶漢式

有餓漢式,對(duì)應(yīng)地,就有懶漢式。懶漢式相對(duì)于餓漢式的優(yōu)勢(shì)是支持延遲加載,具體的代碼實(shí)現(xiàn)如下:

public class LazySingleton {

    private static LazySingleton instance;

    private LazySingleton() {}

    public static LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

以上的寫(xiě)法本質(zhì)上是有問(wèn)題,在多線(xiàn)程環(huán)境下,其實(shí)是無(wú)法保證其單例的特點(diǎn)的,很有可能會(huì)有超過(guò)一個(gè)線(xiàn)程同時(shí)執(zhí)行了new Singleton();解決的辦法簡(jiǎn)單粗暴,直接加鎖,代碼如下:

public class LazySingleton {

    private static LazySingleton instance;

    private LazySingleton() {}

    public static synchronized LazySingleton getInstance(){
        if(instance == null){
            instance = new LazySingleton();
        }
        return instance;
    }
}

以上的寫(xiě)法確實(shí)可以保證jvm中有且僅有一個(gè)單例實(shí)例存在,但是方法上加鎖會(huì)極大 的降低獲取單例對(duì)象的并發(fā)度。同一時(shí)間只有一個(gè)線(xiàn)程可以獲取單例對(duì)象,為了解決 以上的方案則有了第三種寫(xiě)法。

六、雙重檢查鎖

餓漢式不支持延遲加載,懶漢式有性能問(wèn)題,不支持高并發(fā)。那我們?cè)賮?lái)看一種既支 持延遲加載、又支持高并發(fā)的單例實(shí)現(xiàn)方式,也就是雙重檢測(cè)實(shí)現(xiàn)方式(辦法總比困難多嘛):在這種實(shí)現(xiàn)方式中,只要 instance 被創(chuàng)建之后,即便再調(diào)用 getInstance() 函數(shù)也不會(huì)再進(jìn)入到加鎖邏輯中了。所以,這種實(shí)現(xiàn)方式解決了懶漢式并發(fā)度低的問(wèn)題。具體的代碼實(shí)現(xiàn)如下:

public class DoubleCheckSingleton {

    private volatile static DoubleCheckSingleton instance;

    private DoubleCheckSingleton() {}

    public static DoubleCheckSingleton getInstance(){
        if(instance == null){
            synchronized (DoubleCheckSingleton.class){
                if(instance == null){
                    instance = new DoubleCheckSingleton();
                }
            }
        }
        return instance;
    }
}

volatile: 加volatile關(guān)鍵字是為了保證順序性,因?yàn)樵贘ava中創(chuàng)建對(duì)象通常需要三個(gè)主要步驟,分別為分配內(nèi)存空間、初始化對(duì)象、引用賦值,正是因?yàn)閯?chuàng)建需要這三步,導(dǎo)致在多線(xiàn)程環(huán)境下,出現(xiàn)某些線(xiàn)程拿到的對(duì)象是半初始化對(duì)象。譬如:

線(xiàn)程1進(jìn)入雙重檢測(cè)鎖,執(zhí)行第一次檢測(cè),發(fā)現(xiàn)共享的實(shí)例變量為null,因此進(jìn)入同步塊。

線(xiàn)程1在同步塊內(nèi)部創(chuàng)建了單例對(duì)象,然后將實(shí)例變量指向新創(chuàng)建的對(duì)象。

由于指令重排序,創(chuàng)建對(duì)象的操作被移到了實(shí)例變量賦值之前。這樣,實(shí)例變量被賦值,但對(duì)象可能還沒(méi)有完全初始化。

線(xiàn)程2在第一次檢測(cè)時(shí),發(fā)現(xiàn)實(shí)例變量不為null,然后直接返回實(shí)例,但實(shí)例可能沒(méi)有完全初始化,導(dǎo)致不完整或不正確的對(duì)象。

七、靜態(tài)內(nèi)部類(lèi)

我們?cè)賮?lái)看一種比雙重檢測(cè)更加簡(jiǎn)單的實(shí)現(xiàn)方法,那就是利用 Java 的靜態(tài)內(nèi)部類(lèi)。 它有點(diǎn)類(lèi)似餓漢式,但又能做到了延遲加載。具體是怎么做到的呢?我們先來(lái)看它的代碼實(shí)現(xiàn)如下:

public class InnerSingleton {

    private InnerSingleton(){}

    public static InnerSingleton getInstance(){
        return InnerSingletonHolder.instance;
    }
    // 靜態(tài)內(nèi)部類(lèi)實(shí)例化外部類(lèi)對(duì)象
    private static class InnerSingletonHolder{
        private final static InnerSingleton instance = new InnerSingleton();
    }
}

InnerSingletonHolder 是一個(gè)靜態(tài)內(nèi)部類(lèi),當(dāng)外部類(lèi) InnerSingleton被加載的時(shí)候,并不會(huì)創(chuàng)建 InnerSingletonHolder 實(shí)例對(duì)象。只有當(dāng)調(diào)用 getInstance() 方法時(shí),

InnerSingletonHolder 才會(huì)被加載,這個(gè)時(shí)候才會(huì)創(chuàng)建 instance。insance 的唯一性、創(chuàng)建過(guò)程的線(xiàn)程安全性,都由 JVM 來(lái)保證。所以,這種實(shí)現(xiàn)方法既保證了線(xiàn)程安全,又能做到延遲加載。

八、枚舉

基于枚舉類(lèi)型的單例實(shí)現(xiàn)。這種實(shí)現(xiàn)方式通過(guò) Java 枚舉類(lèi)型本身的特性,保證了實(shí)例創(chuàng)建的線(xiàn)程安全性和實(shí)例的唯一性。具體的代碼如下:

public enum EnumSingleton {
    // 對(duì)應(yīng)的枚舉類(lèi),任何一個(gè)枚舉項(xiàng)都是一個(gè)天然的單例
    // 本質(zhì)上就是static final EnumSingleton instance = new EnumSingleton()
    // 枚舉本身支持懶加載
    INSTANCE;
}

更通用的寫(xiě)法如下:

public class EnumSingleton {
    private EnumSingleton(){}

    public static enum SinglentonEnum{
        ESingleton;
        private EnumSingleton instance = null;
        private SinglentonEnum(){
            instance = new EnumSingleton();
        }
        public EnumSingleton getInstance(){
            return instance;
        }
    }
}

通過(guò)調(diào)用 EnumSingleton.SinglentonEnum.ESingleton.getInstance() 方法可以獲取單例對(duì)象。

單例模式就分享到這,希望可以幫助各位碼友!點(diǎn)個(gè)贊吧!?。?/h2>

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-724163.html

到了這里,關(guān)于設(shè)計(jì)模式之單例設(shè)計(jì)模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀(guān)點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • C#--設(shè)計(jì)模式之單例模式

    C#--設(shè)計(jì)模式之單例模式

    單例模式大概是所有設(shè)計(jì)模式中最簡(jiǎn)單的一種,如果在面試時(shí)被問(wèn)及熟悉哪些設(shè)計(jì)模式,你可能第一個(gè)答的就是單例模式。 單例模式的實(shí)現(xiàn)分為兩種: 餓漢式:在靜態(tài)構(gòu)造函數(shù)執(zhí)行時(shí)就立即實(shí)例化。 懶漢式:在程序執(zhí)行過(guò)程中第一次需要時(shí)再實(shí)例化。 兩者有各自適用的場(chǎng)景

    2024年02月14日
    瀏覽(12)
  • 淺談設(shè)計(jì)模式之單例模式

    淺談設(shè)計(jì)模式之單例模式

    單例模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。單例模式指的是 單一的一個(gè)類(lèi) ,該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,并且保證該 對(duì)象唯一 。該類(lèi)提供了一種訪(fǎng)問(wèn)其唯一對(duì)象的方法,外部需要調(diào)用該類(lèi)的對(duì)象可以通過(guò)方法獲取,不需要實(shí)例化類(lèi)的對(duì)象。 關(guān)鍵點(diǎn): 單例

    2024年02月16日
    瀏覽(20)
  • Unity設(shè)計(jì)模式之單例模式

    單例模式(Singleton)是設(shè)計(jì)模式中很常見(jiàn)的一種設(shè)計(jì)模式,目的是為了讓一個(gè)類(lèi)在程序運(yùn)行期間有且僅有一個(gè)實(shí)例,且方便全局訪(fǎng)問(wèn)。 1、私有的構(gòu)造函數(shù)。 2、含有一個(gè)該類(lèi)的靜態(tài)私有對(duì)象。 3、靜態(tài)的公有函數(shù)或?qū)傩?,方便用?hù)創(chuàng)建或者獲取它本身的靜態(tài)私有對(duì)象。 當(dāng)項(xiàng)目

    2023年04月09日
    瀏覽(23)
  • c++設(shè)計(jì)模式之單例模式

    一個(gè)類(lèi)無(wú)論創(chuàng)建多少對(duì)象 , 都只能得到一個(gè)實(shí)例 如上述代碼中,我們通過(guò)new運(yùn)算符創(chuàng)建出了類(lèi)A的三個(gè)對(duì)象實(shí)例,而我們現(xiàn)在要做的是,如何設(shè)計(jì)類(lèi)A,使得上述代碼運(yùn)行之后永遠(yuǎn)只產(chǎn)生同一個(gè)對(duì)象實(shí)例 ????????我們知道,一個(gè)類(lèi)對(duì)象是通過(guò)這個(gè)類(lèi)的構(gòu)造函數(shù)創(chuàng)建的,因此

    2024年01月19日
    瀏覽(26)
  • 萬(wàn)字解析設(shè)計(jì)模式之單例模式

    萬(wàn)字解析設(shè)計(jì)模式之單例模式

    單例模式(Singleton Pattern)是 Java 中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種類(lèi)型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。 這種模式涉及到一個(gè) 單一 的類(lèi),該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保 只有單個(gè)對(duì)象被創(chuàng)建 。這個(gè)類(lèi)提供了一種訪(fǎng)問(wèn)其唯一的對(duì)象的方式,

    2024年02月08日
    瀏覽(28)
  • C++設(shè)計(jì)模式創(chuàng)建型之單例模式

    一、概述 ? ? ? ? 單例模式也稱(chēng)單態(tài)模式,是一種創(chuàng)建型模式,用于創(chuàng)建只能產(chǎn)生一個(gè)對(duì)象實(shí)例的類(lèi)。例如,項(xiàng)目中只存在一個(gè)聲音管理系統(tǒng)、一個(gè)配置系統(tǒng)、一個(gè)文件管理系統(tǒng)、一個(gè)日志系統(tǒng)等,甚至如果吧整個(gè)Windows操作系統(tǒng)看成一個(gè)項(xiàng)目,那么其中只存在一個(gè)任務(wù)管理

    2024年02月14日
    瀏覽(29)
  • Gof23設(shè)計(jì)模式之單例模式(完整)

    單例模式(Singleton pattern)是Java中最簡(jiǎn)單的設(shè)計(jì)模式之一。這種設(shè)計(jì)模式屬于創(chuàng)建型模型,它提供了一種創(chuàng)建對(duì)象的最佳方式。 這種模式涉及到一個(gè)單一的類(lèi),該類(lèi)負(fù)責(zé)創(chuàng)建自己的對(duì)象,同時(shí)確保只有單個(gè)對(duì)象被創(chuàng)建。這個(gè)類(lèi)提供了一種訪(fǎng)問(wèn)其唯一的對(duì)象的方式,可以直接訪(fǎng)

    2024年02月10日
    瀏覽(26)
  • 深入理解設(shè)計(jì)模式-創(chuàng)建型之單例模式

    如果有些數(shù)據(jù)在系統(tǒng)中應(yīng)該且只能保存一份,那就應(yīng)該設(shè)計(jì)為單例類(lèi)。 如:配置類(lèi):在系統(tǒng)中,我們只有一個(gè)配置文件,當(dāng)配置文件被加載到內(nèi)存之后,應(yīng)該被映射為一個(gè)唯一的【配置實(shí)例】,此時(shí)就可以使用單例,當(dāng)然也可以不用。 全局計(jì)數(shù)器:我們使用一個(gè)全局的計(jì)數(shù)

    2024年02月12日
    瀏覽(24)
  • 【Java 設(shè)計(jì)模式】創(chuàng)建型之單例模式

    【Java 設(shè)計(jì)模式】創(chuàng)建型之單例模式

    在軟件開(kāi)發(fā)中,單例模式是一種常見(jiàn)的設(shè)計(jì)模式, 它確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪(fǎng)問(wèn)點(diǎn) 。單例模式在需要控制某些資源,如數(shù)據(jù)庫(kù)連接池、線(xiàn)程池等共享資源的情況下非常有用。在本文中,我們將介紹 Java 設(shè)計(jì)模式中的單例模式,了解其實(shí)現(xiàn)方式、使用場(chǎng)景

    2024年01月18日
    瀏覽(26)
  • 跟著GPT學(xué)設(shè)計(jì)模式之單例模式

    單例設(shè)計(jì)模式(Singleton Design Pattern)一個(gè)類(lèi)只允許創(chuàng)建一個(gè)對(duì)象(或者實(shí)例),那這個(gè)類(lèi)就是一個(gè)單例類(lèi),這種設(shè)計(jì)模式就叫作單例設(shè)計(jì)模式,簡(jiǎn)稱(chēng)單例模式。 單例有幾種經(jīng)典的實(shí)現(xiàn)方式,它們分別是:餓漢式、懶漢式、雙重檢測(cè)、靜態(tài)內(nèi)部類(lèi)、枚舉。 處理資源訪(fǎng)問(wèn)沖突,

    2024年02月05日
    瀏覽(28)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包