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

Java與設(shè)計模式(4):單例模式

這篇具有很好參考價值的文章主要介紹了Java與設(shè)計模式(4):單例模式。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、定義

單例模式是一種創(chuàng)建型設(shè)計模式,它確保一個類只有一個實例,并提供全局訪問點來訪問該實例。

在單例模式中,類的構(gòu)造函數(shù)被私有化,從而禁止外部直接實例化該類。通過一個靜態(tài)方法或靜態(tài)變量來控制類的實例化過程,并返回同一個實例。

單例模式的特點包括:

  1. 單一實例:單例模式確保一個類只有一個實例存在,無論在何處訪問該類,都只能獲得同一個實例。

  2. 全局訪問點:單例模式提供了一個全局訪問點,使得其他類可以方便地訪問該實例。

  3. 延遲實例化:單例模式可以實現(xiàn)延遲實例化,即在第一次使用時才創(chuàng)建實例,提高了系統(tǒng)的性能和資源利用率。

  4. 線程安全:在多線程環(huán)境下,單例模式可以確保實例的唯一性和線程安全性。

常見的單例模式實現(xiàn)方式包括:

  1. 餓漢式:在類加載時就創(chuàng)建實例,并通過靜態(tài)方法返回實例。線程安全,但可能導(dǎo)致資源浪費。

  2. 懶漢式:在第一次使用時才創(chuàng)建實例,并通過靜態(tài)方法返回實例。需要考慮線程安全性,可以使用雙重檢查鎖定等方式來保證線程安全。

  3. 靜態(tài)內(nèi)部類:使用靜態(tài)內(nèi)部類來持有實例,在第一次使用時才創(chuàng)建實例。線程安全,且實現(xiàn)簡單。

  4. 枚舉類:利用枚舉類的特性,保證實例的唯一性和線程安全性。實現(xiàn)簡單,且可以防止反射和序列化等攻擊。

單例模式在需要確保類只有一個實例且全局可訪問時非常有用,例如數(shù)據(jù)庫連接池、線程池、配置信息等。但過度使用單例模式可能導(dǎo)致代碼的耦合性增加和測試困難,因此需要謹慎使用。

二、Java示例

  1. 餓漢式單例模式:
public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {
        // 私有構(gòu)造函數(shù),防止外部實例化
    }

    public static Singleton getInstance() {
        return instance;
    }

    // 其他業(yè)務(wù)方法
    public void doSomething() {
        // ...
    }
}
  1. 懶漢式單例模式:
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有構(gòu)造函數(shù),防止外部實例化
    }

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

    // 其他業(yè)務(wù)方法
    public void doSomething() {
        // ...
    }
}
  1. 靜態(tài)內(nèi)部類單例模式:
public class Singleton {
    private Singleton() {
        // 私有構(gòu)造函數(shù),防止外部實例化
    }

    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }

    // 其他業(yè)務(wù)方法
    public void doSomething() {
        // ...
    }
}
  1. 枚舉類單例模式:
public enum Singleton {
    INSTANCE;

    // 其他業(yè)務(wù)方法
    public void doSomething() {
        // ...
    }
}

三、優(yōu)點

單例模式的優(yōu)點包括:

  1. 確保唯一實例:單例模式確保一個類只有一個實例存在,避免了多個實例的創(chuàng)建和資源的浪費。

  2. 全局訪問點:單例模式提供了一個全局訪問點,使得其他類可以方便地訪問該實例,簡化了對象的引用和傳遞。

  3. 節(jié)省資源:單例模式可以延遲實例化,即在第一次使用時才創(chuàng)建實例,提高了系統(tǒng)的性能和資源利用率。

  4. 線程安全:在多線程環(huán)境下,單例模式可以確保實例的唯一性和線程安全性,避免了多線程競爭和數(shù)據(jù)不一致的問題。

  5. 易于擴展:由于單例模式只有一個實例存在,對該實例的操作和管理變得簡單,容易進行擴展和修改。

  6. 適用于資源共享:單例模式適用于需要共享資源的場景,例如數(shù)據(jù)庫連接池、線程池、配置信息等。

單例模式在需要確保類只有一個實例且全局可訪問時非常有用。它提供了一種簡單、可靠的方式來管理和訪問唯一實例,提高了系統(tǒng)的性能、資源利用率和代碼的可維護性。

四、缺點

  1. 難以擴展:由于單例模式只允許一個實例存在,因此擴展時可能會受到限制。如果需要創(chuàng)建多個實例或者變更實例的行為,可能需要修改單例模式的實現(xiàn)。

  2. 對象生命周期管理困難:由于單例模式的實例在整個應(yīng)用程序的生命周期中存在,因此可能會導(dǎo)致對象的生命周期管理變得復(fù)雜。如果單例對象長時間持有資源或者狀態(tài),可能會導(dǎo)致資源泄漏或者影響系統(tǒng)性能。

  3. 破壞單一職責原則:單例模式將對象的創(chuàng)建和管理邏輯耦合在一起,可能違反了單一職責原則。單例類既要負責創(chuàng)建實例,又要負責管理實例的生命周期,可能導(dǎo)致類的職責不清晰。

  4. 難以進行單元測試:由于單例模式的實例是全局可訪問的,可能會在單元測試中引入不可控的因素。如果單例對象依賴外部資源或者狀態(tài),可能會導(dǎo)致測試結(jié)果不穩(wěn)定。

  5. 可能引起性能問題:某些單例模式的實現(xiàn)方式可能會引起性能問題。例如,懶漢式的單例模式在多線程環(huán)境下需要考慮線程安全性,可能會引起性能下降。

雖然單例模式有一些缺點,但在需要確保類只有一個實例且全局可訪問時,單例模式仍然是一種常用的設(shè)計模式。

五、使用場景

單例模式適用于以下場景:

  1. 系統(tǒng)中只需要一個實例:當系統(tǒng)中某個類只需要一個實例來協(xié)調(diào)操作、管理資源或提供全局訪問時,可以使用單例模式。例如,數(shù)據(jù)庫連接池、線程池、日志記錄器等。

  2. 全局共享訪問點:當多個對象需要共享同一個實例時,可以使用單例模式。單例模式提供了一個全局訪問點,使得其他類可以方便地訪問該實例。例如,配置信息、緩存管理器等。

  3. 延遲實例化:當創(chuàng)建實例的過程較為耗時,且在系統(tǒng)啟動時并不需要立即使用實例時,可以使用懶漢式的單例模式。懶漢式單例模式延遲實例化,避免了不必要的資源消耗。

  4. 線程池、線程管理器:在多線程環(huán)境下,使用單例模式可以確保線程安全性和避免資源沖突。例如,線程池、線程管理器等多線程相關(guān)的組件。

  5. 日志記錄器、緩存管理器:在需要統(tǒng)一管理和訪問日志記錄器、緩存管理器等資源的場景中,可以使用單例模式。單例模式提供了一個全局訪問點,方便其他類進行日志記錄和緩存管理。

六、注意事項

在使用單例模式時,需要注意以下幾點:

  1. 線程安全性:如果在多線程環(huán)境下使用單例模式,需要考慮線程安全性??梢圆捎眉渔i、雙重檢查鎖定等方式來保證線程安全性。

  2. 延遲實例化:如果使用懶漢式的單例模式,在第一次使用實例時才創(chuàng)建對象,需要注意延遲實例化可能帶來的性能問題??梢愿鶕?jù)具體情況權(quán)衡是否需要延遲實例化。

  3. 序列化與反序列化:如果單例類需要支持序列化和反序列化,需要注意實現(xiàn)Serializable接口,并且提供readResolve()方法來保證反序列化時返回同一個實例。

  4. 避免濫用單例模式:單例模式應(yīng)該謹慎使用,不應(yīng)該用于所有類。只有在確實需要全局唯一實例且全局可訪問時才應(yīng)該使用單例模式。

  5. 單一職責原則:盡量遵循單一職責原則,將單例類的創(chuàng)建和管理邏輯與其他業(yè)務(wù)邏輯分離,使得類的職責更加清晰。

  6. 可測試性:由于單例模式的實例是全局可訪問的,可能會在單元測試中引入不可控的因素。需要注意設(shè)計單例類時的可測試性,可以使用依賴注入等方式來解耦依賴關(guān)系。

  7. 反射攻擊:單例模式在某些情況下可能會受到反射攻擊??梢酝ㄟ^在構(gòu)造函數(shù)中添加判斷,防止通過反射創(chuàng)建多個實例。

七、在spring 中的應(yīng)用

在Spring框架中,單例模式的應(yīng)用非常廣泛。Spring容器本身就是一個單例,它負責管理和創(chuàng)建應(yīng)用中的各個Bean實例。

在Spring中,可以通過配置文件或注解的方式將一個類聲明為單例,讓Spring容器負責創(chuàng)建和管理該類的實例。具體的應(yīng)用場景包括:

  1. Service層:通常將Service層的組件聲明為單例,以確保在整個應(yīng)用程序中只有一個Service實例。這樣可以保證Service層的共享資源和狀態(tài)的一致性。

  2. Repository層:將Repository層的數(shù)據(jù)訪問組件聲明為單例,以確保在整個應(yīng)用程序中只有一個數(shù)據(jù)訪問實例。這樣可以提高數(shù)據(jù)庫連接的復(fù)用和性能。

  3. 工具類:將一些通用的工具類聲明為單例,例如日志記錄器、緩存管理器等。這樣可以方便其他組件共享和訪問這些工具類的實例。

  4. 配置類:在Spring中,可以使用@Configuration注解將配置類聲明為單例。這樣可以確保配置信息的一致性和全局可訪問性。

需要注意的是,在Spring中,默認情況下所有的Bean都是單例的,即每個Bean在容器中只有一個實例。但也可以通過配置來改變Bean的作用域,例如使用@Scope注解來聲明為原型(prototype)作用域,使得每次獲取Bean時都會創(chuàng)建一個新的實例。
Spring框架提供了強大的依賴注入和對象管理功能,可以方便地將類聲明為單例,并由Spring容器負責創(chuàng)建和管理實例,提高了代碼的可維護性和靈活性。文章來源地址http://www.zghlxwxcb.cn/news/detail-519813.html

到了這里,關(guān)于Java與設(shè)計模式(4):單例模式的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • java設(shè)計模式-單例

    單例模式是一種創(chuàng)建型設(shè)計模式,它可以保證一個類只有一個實例,并提供全局訪問點。單例模式在實際開發(fā)中經(jīng)常使用,可以避免多個實例引起的資源浪費和同步問題。常見的java實現(xiàn)方式有多種。 餓漢式單例模式是指在類加載時就創(chuàng)建了單例對象,因此在調(diào)用時不需要再

    2024年01月18日
    瀏覽(26)
  • 設(shè)計模式篇(Java):單例模式

    設(shè)計模式篇(Java):單例模式

    上一篇:設(shè)計模式篇(Java):前言(UML類圖、七大原則) 所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法(靜態(tài)方法)。 構(gòu)造器私有化 (防止 new ) 類的內(nèi)部創(chuàng)建對象 向外暴露一個靜

    2024年02月11日
    瀏覽(29)
  • Java設(shè)計模式---單例 工廠 代理模式

    單例模式是設(shè)計模式中的一種,屬于創(chuàng)建型模式。在軟件工程中,單例模式確保一個類只有一個實例,并提供一個全局訪問點。這種模式常用于那些需要頻繁實例化然后引用,且創(chuàng)建新實例的開銷較大的類,例如數(shù)據(jù)庫連接池、緩存管理等。 意圖 :保證一個類僅有一個實例

    2024年01月24日
    瀏覽(28)
  • Java——單例設(shè)計模式

    Java——單例設(shè)計模式

    設(shè)計模式是在大量的實踐中總結(jié)和理論化之后優(yōu)選的代碼結(jié)構(gòu)、編程風格、以及解決問題的思考方式。設(shè)計模式免去我們自己再思考和摸索。就像是經(jīng)典的棋譜,不同的棋局,我們用不同的棋譜、“套路”。 經(jīng)典的設(shè)計模式共有23種。每個設(shè)計模式均是特定環(huán)境下特定問題的

    2024年02月11日
    瀏覽(27)
  • 【JAVA】Java 中什么叫單例設(shè)計模式?請用 Java 寫出線程安全的單例模式

    【JAVA】Java 中什么叫單例設(shè)計模式?請用 Java 寫出線程安全的單例模式

    ?? 個人博客: 個人主頁 ?? 個人專欄: JAVA ???? 功不唐捐,玉汝于成 目錄 前言 正文 懶漢式(Lazy Initialization): 雙重檢查鎖定(Double-Checked Locking): 結(jié)語 我的其他博客 在軟件設(shè)計中,單例設(shè)計模式是一種重要的設(shè)計思想,它確保了一個類只有一個實例,并提供了一

    2024年01月15日
    瀏覽(23)
  • Java設(shè)計模式之單例模式

    Java設(shè)計模式之單例模式

    定義:保證一個類僅有一個實例,并提供一個全局訪問點 類型:創(chuàng)建型 想確保任何情況下都絕對只有一個實例 例如:線程池,數(shù)據(jù)庫連接池一般都為單例模式 單例模式優(yōu)點 在內(nèi)存中只有一個實例,減少內(nèi)存開銷 可以避免對資源的多重占用 設(shè)置全局訪問點,嚴格控制訪問

    2024年02月02日
    瀏覽(56)
  • Java設(shè)計模式(八)— 單例模式3

    Java設(shè)計模式(八)— 單例模式3

    單例模式之靜態(tài)內(nèi)部類 單例模式之枚舉方式 單例模式之JDK源碼分析 Hello,小伙伴們,歡迎來到柚子的博客~讓我們一起成長吧o( ̄▽ ̄)ブ 提示:以下是本篇文章正文內(nèi)容,下面案例可供參考 代碼如下(示例): 類被裝載的時候,類里面的靜態(tài)內(nèi)部類也是會被裝載的,而且線

    2024年02月09日
    瀏覽(55)
  • 03-JAVA設(shè)計模式-單例模式詳解

    03-JAVA設(shè)計模式-單例模式詳解

    單例模式(Singleton Pattern)是設(shè)計模式中的一種,它確保一個類僅有一個實例,并提供一個全局訪問點來訪問該實例。這種設(shè)計模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對象的最佳方式。 單例模式的應(yīng)用場景十分廣泛,主要涉及需要頻繁使用某個對象而又不想重復(fù)創(chuàng)建的情況

    2024年04月13日
    瀏覽(30)
  • Java與設(shè)計模式(4):單例模式

    單例模式是一種創(chuàng)建型設(shè)計模式,它確保一個類只有一個實例,并提供全局訪問點來訪問該實例。 在單例模式中,類的構(gòu)造函數(shù)被私有化,從而禁止外部直接實例化該類。通過一個靜態(tài)方法或靜態(tài)變量來控制類的實例化過程,并返回同一個實例。 單例模式的特點包括: 單一

    2024年02月12日
    瀏覽(27)
  • java設(shè)計模式-單例模式(Singleton)

    單例模式(Singleton)就是一個類只能有一個實例,自行實例化,并向系統(tǒng)提供這一實例,這個類就是單例類。單例模式的特點: 一個類只能有一個實例; 單例類自己實例化; 單例類給其它對象提供這個單一實例。 資源管理類經(jīng)常被設(shè)計為單例模式,例如管理屬性文件的類。

    2024年02月15日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包