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

Java設(shè)計(jì)模式之創(chuàng)建型-單例模式(UML類圖+案例分析)

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

目錄

一、基礎(chǔ)概念

二、UML類圖

三、角色設(shè)計(jì)

四、案例分析

4.1、餓漢模式

4.2、懶漢模式(線程不安全)

4.3、懶漢模式(線程安全)

4.4、雙重檢索模式

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

4.6、枚舉?

五、總結(jié)


一、基礎(chǔ)概念

單例模式確保一個(gè)類只有一個(gè)實(shí)例,提供一個(gè)全局訪問點(diǎn)。一般實(shí)現(xiàn)方式是把構(gòu)造函數(shù)設(shè)為私有,并提供一個(gè)靜態(tài)方法獲取實(shí)例對(duì)象。

二、UML類圖

Java設(shè)計(jì)模式之創(chuàng)建型-單例模式(UML類圖+案例分析),Java,設(shè)計(jì)模式,java,設(shè)計(jì)模式,單例模式

三、角色設(shè)計(jì)

角色 描述
單例 在單例類的內(nèi)部實(shí)現(xiàn)只生成一個(gè)實(shí)例,同時(shí)它提供一個(gè)靜態(tài)的 getInstance()方法,讓外部以訪問它的唯一實(shí)例;為了防止在外部對(duì)其實(shí)例化,將其構(gòu)造函數(shù)設(shè)計(jì)為私有;在單例類內(nèi)部定義了一個(gè) Singleton類型的靜態(tài)對(duì)象,作為外部共享的唯一實(shí)例。

四、案例分析

4.1、餓漢模式

直接在類內(nèi)部創(chuàng)建一個(gè)靜態(tài)final常量實(shí)例,線程安全,調(diào)用效率高,但無法延遲加載。

public class Singleton_Hungry {
    /**
     * 私有實(shí)例,靜態(tài)變量會(huì)在類加載的時(shí)候初始化,是線程安全的
     */
    private static final Singleton_Hungry instance = new Singleton_Hungry();

    /**
     * 私有構(gòu)造方法
     */
    private Singleton_Hungry() {
    }

    /**
     * 獲取實(shí)例的方法
     */
    public static Singleton_Hungry getInstance() {
        return instance;
    }
}

4.2、懶漢模式(線程不安全)

起初沒有實(shí)例,第一次調(diào)用才初始化,線程不安全,需加鎖處理。

public class Singleton_Lazy {
    /**
     * 私有實(shí)例
     */
    private static Singleton_Lazy instance;

    /**
     * 私有構(gòu)造方法
     */
    private Singleton_Lazy() {
    }

    /**
     * 獲取實(shí)例的方法
     */
    public static Singleton_Lazy getInstance() {
        if (instance == null) {
            instance = new Singleton_Lazy();
        }
        return instance;
    }
}

4.3、懶漢模式(線程安全)

加鎖處理,線程安全但影響效率,大部分情況下不需要同步。

public class Singleton_Lazy_Safe {

    /**
     * 私有實(shí)例
     */
    private static Singleton_Lazy_Safe instance;

    /**
     * 私有構(gòu)造方法
     */
    private Singleton_Lazy_Safe () {
    }

    /**
     * 獲取實(shí)例的方法,該方法使用synchronized加鎖,來保證線程安全性
     */
    public static synchronized Singleton_Lazy_Safe getInstance() {
        if (instance == null) {
            instance = new Singleton_Lazy_Safe ();
        }
        return instance;
    }
}

4.4、雙重檢索模式

雙重檢查鎖單例模式是在懶漢式單例模式的基礎(chǔ)上,額外加鎖保證多線程安全,同時(shí)保證效率,并且加入了第二次判斷,避免多線程下創(chuàng)建多個(gè)實(shí)例。

public class Singleton_Lazy_Double {
    
    //用volatile關(guān)鍵字確保 instance 在多線程下的可見性
    private static volatile Singleton_Lazy_Double instance = null;

    //將構(gòu)造方法私有化,禁止外部通過構(gòu)造方法創(chuàng)建實(shí)例
    private Singleton_Lazy_Double() {}

    //提供一個(gè)公共的訪問方法,用于獲取該類的唯一實(shí)例
    public static Singleton_Lazy_Double getInstance() {
        //如果instance為空,就進(jìn)行實(shí)例化
        if (instance == null) {
            //保證多線程下只有一個(gè)線程進(jìn)行實(shí)例化
            synchronized (Singleton_Lazy_Double.class) {
                //第二次判斷,避免多線程下創(chuàng)建多個(gè)實(shí)例
                if (instance == null) {
                    instance = new Singleton_Lazy_Double();
                }
            }
        }
        return instance;
    }

}

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

靜態(tài)內(nèi)部類單例模式是在類加載時(shí)會(huì)創(chuàng)建一個(gè)靜態(tài)內(nèi)部類,調(diào)用getInstance方法時(shí)才會(huì)去加載該內(nèi)部類并初始化INSTANCE實(shí)例。該方式既保證了線程安全,也保證了懶加載和高效訪問的特性。

public class SingletonStatic {

    /**
     * 私有構(gòu)造方法
     */
    private SingletonStatic() {
    }

    /**
     * 取實(shí)例的方法
     */
    public static SingletonStatic getInstance() {
        return LazyHolder.INSTANCE;
    }

    /**
     * 私有靜態(tài)內(nèi)部類
     */
    private static class LazyHolder {
        private static final SingletonStatic INSTANCE = new SingletonStatic();
    }
}

4.6、枚舉?

使用枚舉實(shí)現(xiàn)單例模式可以節(jié)省大量代碼,并且防止多線程安全以及反序列化及反射攻擊的問題。

public enum SingletonEnum {

    INSTANCE;

    public void test() {
        System.out.println("hello");
    }

}

五、總結(jié)

優(yōu)點(diǎn):

1、在內(nèi)存中只有一個(gè)實(shí)例,減少內(nèi)存開銷。避免對(duì)資源的多重占用。設(shè)置全局訪問點(diǎn),嚴(yán)格控制訪問。

缺點(diǎn):

1、不符合單一職責(zé)原則。擴(kuò)展困難,如果要擴(kuò)展需要修改源代碼。攻擊者可通過反射和反序列化的方式獲取實(shí)例而破壞單例。

應(yīng)用場(chǎng)景:

1、需要頻繁實(shí)例化然后銷毀的對(duì)象、創(chuàng)建對(duì)象時(shí)消耗資源過多的情況等。

2、單例模式應(yīng)用在工具類、線程池、配置類、對(duì)話框、日志對(duì)象、緩存等場(chǎng)景中,在工具類中應(yīng)用是最為典型的。

符合的設(shè)計(jì)原則:

1、單一職責(zé)原則(Single Responsibility Principle)

單例類只負(fù)責(zé)創(chuàng)建自己的一個(gè)實(shí)例,有且只有這一個(gè)職責(zé)。

2、開閉原則(Open Closed Principle)

單例類可以通過擴(kuò)展改變內(nèi)部實(shí)現(xiàn)邏輯,而不影響調(diào)用端。

3、里氏替換原則(Liskov Substitution Principle)

單例類一般會(huì)實(shí)現(xiàn)一個(gè)接口定義方法,任何擴(kuò)展的實(shí)現(xiàn)會(huì)保持一致性。

4、依賴倒轉(zhuǎn)原則(Dependency Inversion Principle)

調(diào)用端通過接口依賴單例,不依賴具體實(shí)現(xiàn),降低了依賴度。

5、接口隔離原則(Interface Segregation Principle)

單例類只定義獲取實(shí)例的接口,符合接口隔離原則。

枚舉實(shí)現(xiàn)單例最大優(yōu)點(diǎn)是實(shí)現(xiàn)簡(jiǎn)單,天生線程安全,防反射攻擊,是首選方式。

總的來說,以上各種實(shí)現(xiàn)方式之間存在效率、線程安全、懶加載等方面的權(quán)衡和區(qū)別,應(yīng)根據(jù)需要選用最合適的單例模式實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-546980.html

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

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • Java設(shè)計(jì)模式之結(jié)構(gòu)型-橋接模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之結(jié)構(gòu)型-橋接模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、支付方式 4.2、支付渠道? 五、總結(jié) 橋接模式(Bridge Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,其主要目的是“將抽象部分與實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立地變化”。 橋接模式的核心思想是把抽象(abstraction)與實(shí)現(xiàn)

    2024年02月13日
    瀏覽(22)
  • Java設(shè)計(jì)模式之行為型-責(zé)任鏈模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之行為型-責(zé)任鏈模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、在Java中實(shí)現(xiàn) 4.2、在SpringBoot中實(shí)現(xiàn)? 五、總結(jié)? 責(zé)任鏈模式是一種行為設(shè)計(jì)模式,它允許你將請(qǐng)求沿著處理者鏈進(jìn)行發(fā)送。請(qǐng)求會(huì)被鏈上每個(gè)處理者處理,直到請(qǐng)求被處理完畢。該模式主要解決的是請(qǐng)求的發(fā)送者和

    2024年02月15日
    瀏覽(22)
  • Java設(shè)計(jì)模式之行為型-迭代器模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之行為型-迭代器模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 五、總結(jié) 迭代器模式是一種常用的設(shè)計(jì)模式,它主要用于遍歷集合對(duì)象,提供一種方法順序訪問一個(gè)聚合對(duì)象中的各個(gè)元素,而又不暴露該對(duì)象的內(nèi)部表示。 舉個(gè)簡(jiǎn)單的比喻,聚合對(duì)象像一個(gè)存放蘋果的籃子,迭代

    2024年02月16日
    瀏覽(63)
  • Java設(shè)計(jì)模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、基本實(shí)現(xiàn) 4.2、菜單遍歷? 五、總結(jié)? 組合模式(Composite Pattern)又叫部分-整體模式,它通過將對(duì)象組合成樹形結(jié)構(gòu)來表示“整體-部分”的層次關(guān)系,允許用戶統(tǒng)一單個(gè)對(duì)象和組合對(duì)象的處理邏輯。 角色 描述

    2024年02月16日
    瀏覽(25)
  • Java設(shè)計(jì)模式之行為型-訪問者模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之行為型-訪問者模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 五、總結(jié) 訪問者模式是一種對(duì)象行為型設(shè)計(jì)模式,它能夠在不修改已有對(duì)象結(jié)構(gòu)的前提下,為對(duì)象結(jié)構(gòu)中的每個(gè)對(duì)象提供新的操作。 訪問者模式的主要作用是把對(duì)元素對(duì)象的操作抽象出來封裝到訪問者類中,這樣就

    2024年02月16日
    瀏覽(36)
  • Java設(shè)計(jì)模式之結(jié)構(gòu)型-裝飾器模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之結(jié)構(gòu)型-裝飾器模式(UML類圖+案例分析)

    目錄 一、基本概念 二、UML類圖 三、角色設(shè)計(jì) 四、代碼實(shí)現(xiàn) 案例一 案例二? 五、總結(jié)? 裝飾器模式是指不必在改變?cè)械念惡筒皇褂美^承的情況下,動(dòng)態(tài)擴(kuò)展一個(gè)對(duì)象的功能。 角色 描述 抽象構(gòu)件 是一個(gè)接口或者抽象類,定義我們最核心的對(duì)象 具體構(gòu)件 抽象構(gòu)件的實(shí)現(xiàn),

    2024年02月11日
    瀏覽(26)
  • Java設(shè)計(jì)模式之結(jié)構(gòu)型-享元模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之結(jié)構(gòu)型-享元模式(UML類圖+案例分析)

    目錄 一、基本概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、基本實(shí)現(xiàn) 4.2、游戲角色 五、總結(jié) 享元模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,主要用于減少創(chuàng)建大量相似對(duì)象所占用的內(nèi)存,它通過共享技術(shù)來有效支持大量細(xì)粒度的對(duì)象。 角色 描述 抽象享元角色 定義出對(duì)象的外部狀

    2024年02月16日
    瀏覽(27)
  • Java設(shè)計(jì)模式之行為型-備忘錄模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之行為型-備忘錄模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 五、總結(jié)? 備忘錄模式是一種行為型設(shè)計(jì)模式,它允許保存一個(gè)對(duì)象的內(nèi)部狀態(tài)到一個(gè)備忘錄對(duì)象中,這樣就可以在需要的時(shí)候恢復(fù)這個(gè)對(duì)象的狀態(tài)了,同時(shí)又不違反封裝性原則。 這個(gè)模式的核心就是備忘錄對(duì)象,

    2024年02月16日
    瀏覽(24)
  • Java設(shè)計(jì)模式之UML類圖

    Java設(shè)計(jì)模式之UML類圖

    UML圖有很多種,但是并非必須掌握所有的UML圖,才能完整系統(tǒng)分析和設(shè)計(jì)工作。一般說來,在UML圖中,只要掌握類圖、用例圖、時(shí)序圖的使用,就能完成大部分的工作。對(duì)于程序員來說,最頻繁使用的莫過于類圖。因此,這里我只講解UML類圖。 類圖是面向?qū)ο笙到y(tǒng)建模中最常

    2024年02月03日
    瀏覽(21)
  • Java設(shè)計(jì)模式之責(zé)任鏈模式(UML類圖分析+代碼詳解)

    Java設(shè)計(jì)模式之責(zé)任鏈模式(UML類圖分析+代碼詳解)

    大家好,我是一名在算法之路上不斷前進(jìn)的小小程序猿!體會(huì)算法之美,領(lǐng)悟算法的智慧~ 希望各位博友走過路過可以給我點(diǎn)個(gè)免費(fèi)的贊,你們的支持是我不斷前進(jìn)的動(dòng)力!! 加油吧!未來可期?。?本文將介紹java設(shè)計(jì)模式之責(zé)任鏈模式 OA系統(tǒng)采購(gòu)審批需求 傳統(tǒng)方案解決OA系

    2024年02月06日
    瀏覽(16)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包