成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java設(shè)計(jì)模式-單例模式:?jiǎn)卫牧N實(shí)現(xiàn)

番茄西紅柿 / 2370人閱讀

摘要:?jiǎn)卫J降膬?yōu)缺點(diǎn)優(yōu)點(diǎn)單例模式在內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存開(kāi)支,尤其是頻繁的創(chuàng)建和銷(xiāo)毀實(shí)例。單例模式對(duì)測(cè)試不利。單例模式與單一職責(zé)原則有沖突,一個(gè)類(lèi)應(yīng)該只實(shí)現(xiàn)一個(gè)邏輯,而不用關(guān)心它是否是單例的。資源源碼參考設(shè)計(jì)模式之禪

原文地址:xeblog.cn/articles/16

單例模式的定義

確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。

UML類(lèi)圖

單例類(lèi)的構(gòu)造函數(shù)是 private 內(nèi)部私有的,確保外部不能通過(guò) new 的方式創(chuàng)建新對(duì)象,內(nèi)部自行實(shí)例化,并對(duì)外提供一個(gè)訪問(wèn)該單一實(shí)例的靜態(tài)的方法 Instance() 。

單例模式的實(shí)現(xiàn) 普通餓漢式
/**
 * 普通餓漢式
 *
 * @author anlingyi
 */
public class Singleton {
    /**
     * 類(lèi)加載時(shí)進(jìn)行實(shí)例化對(duì)象
     */
    private static final Singleton SINGLETON = new Singleton();

    /**
     * 私有構(gòu)造,防止外部new對(duì)象
     */
    private Singleton() {

    }

    /**
     * 通過(guò)靜態(tài)方法獲取對(duì)象實(shí)例
     *
     * @return
     */
    public static Singleton getInstance() {
        return SINGLETON;
    }

    public void say() {
        System.out.println("普通餓漢式:Hello World!");
    }
}

調(diào)用方式:

Singleton singleton = Singleton.getInstance();
singleton.say();

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

優(yōu)點(diǎn): 類(lèi)加載時(shí)就進(jìn)行實(shí)例化,之后的操作效率會(huì)很高。
缺點(diǎn): 由于類(lèi)加載時(shí)就進(jìn)行實(shí)例化,如果后續(xù)不對(duì)此類(lèi)進(jìn)行任何操作,就會(huì)導(dǎo)致內(nèi)存的浪費(fèi)。

線(xiàn)程不安全的懶漢式
/**
 * 懶漢式(線(xiàn)程不安全)
 *
 * @author anlingyi
 */
public class SingletonTwo {

    private static SingletonTwo instance;

    /**
     * 私有構(gòu)造,防止外部new對(duì)象
     */
    private SingletonTwo() {

    }

    /**
     * 通過(guò)靜態(tài)方法獲取對(duì)象實(shí)例
     *
     * @return
     */
    public static SingletonTwo getInstance() {
        if(instance == null) {
            instance = new SingletonTwo();
        }

        return instance;
    }

    public void say() {
        System.out.println("懶漢式(線(xiàn)程不安全):Hello World!");
    }
}

調(diào)用方式:

SingletonTwo singleton = SingletonTwo.getInstance();
singleton.say();

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

優(yōu)點(diǎn): 在第一次調(diào)用的時(shí)候才進(jìn)行實(shí)例化。
缺點(diǎn): 當(dāng)多個(gè)線(xiàn)程同時(shí)進(jìn)入到 if(instance == null) {...} 時(shí),會(huì)創(chuàng)建多個(gè)對(duì)象。

同步鎖懶漢式
/**
 * 同步鎖懶漢式(線(xiàn)程安全,效率低)
 *
 * @author anlingyi
 */
public class SingletonThree {

    private static SingletonThree instance;

    /**
     * 私有構(gòu)造,防止外部new對(duì)象
     */
    private SingletonThree() {

    }

    /**
     * 通過(guò)靜態(tài)方法獲取對(duì)象實(shí)例
     *
     * @return
     */
    public static synchronized SingletonThree getInstance() {
        if(instance == null) {
            instance = new SingletonThree();
        }

        return instance;
    }

    public void say() {
        System.out.println("同步鎖懶漢式(線(xiàn)程安全,效率低):Hello World!");
    }
}

調(diào)用方式:

SingletonThree singleton = SingletonThree.getInstance();
singleton.say();

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

優(yōu)點(diǎn): 在第一次調(diào)用的時(shí)候才進(jìn)行實(shí)例化,且線(xiàn)程安全。
缺點(diǎn): 使用 synchronized 的方式對(duì)方法加鎖,會(huì)影響效率。

雙重校驗(yàn)鎖懶漢式
/**
 * 雙重校驗(yàn)鎖懶漢式(線(xiàn)程安全,且多線(xiàn)程環(huán)境下可以保持高性能)
 *
 * @author anlingyi
 */
public class SingletonFour {

    /**
     * volatile是為了防止指令重排序
     */
    private static volatile SingletonFour instance;

    /**
     * 私有構(gòu)造,防止外部new對(duì)象
     */
    private SingletonFour() {

    }

    /**
     * 通過(guò)靜態(tài)方法獲取對(duì)象實(shí)例
     *
     * @return
     */
    public static SingletonFour getInstance() {
        if(instance == null) {
            synchronized (SingletonFour.class) {
                if(instance == null) {
                    instance = new SingletonFour();
                }
            }
        }

        return instance;
    }

    public void say() {
        System.out.println("雙重校驗(yàn)鎖懶漢式(線(xiàn)程安全,且多線(xiàn)程環(huán)境下可以保持高性能):Hello World!");
    }
}

調(diào)用方式:

SingletonFour singleton = SingletonFour.getInstance();
singleton.say();

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

優(yōu)點(diǎn): 在第一次調(diào)用的時(shí)候才進(jìn)行實(shí)例化,且線(xiàn)程安全,效率較高。
缺點(diǎn): 實(shí)現(xiàn)復(fù)雜,且 volatile 需要在JDK1.5之后的版本才能確保安全。

靜態(tài)內(nèi)部類(lèi)懶漢式
/**
 * 靜態(tài)內(nèi)部類(lèi)懶漢式
 *
 * @author anlingyi
 */
public class SingletonFive {

    /**
     * 私有構(gòu)造,防止外部new對(duì)象
     */
    private SingletonFive() {

    }

    /**
     * 通過(guò)靜態(tài)方法獲取對(duì)象實(shí)例
     *
     * @return
     */
    public static SingletonFive getInstance() {
        return Singleton.SINGLETON;
    }

    public void say() {
        System.out.println("靜態(tài)內(nèi)部類(lèi)懶漢式:Hello World!");
    }

    /**
     * 靜態(tài)內(nèi)部類(lèi)實(shí)例化對(duì)象
     */
    private static class Singleton {
        /**
         * 類(lèi)加載時(shí)進(jìn)行實(shí)例化對(duì)象
         */
        private static final SingletonFive SINGLETON = new SingletonFive();
    }
}

調(diào)用方式:

SingletonFive singleton = SingletonFive.getInstance();
singleton.say();

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

優(yōu)點(diǎn): 只有在調(diào)用 getInstance() 方法的時(shí)候,靜態(tài)內(nèi)部類(lèi)才會(huì)被加載,從而對(duì)主類(lèi)(我們需要的類(lèi))進(jìn)行實(shí)例化,即線(xiàn)程安全,又效率高。
缺點(diǎn): 多創(chuàng)建一個(gè)類(lèi)。

枚舉類(lèi)餓漢式(防止反序列化)
/**
 * 枚舉類(lèi)餓漢式(防止反序列化)
 *
 * @author anlingyi
 */
public enum  SingletonSix {
    INSTANCE;

    public void say() {
        System.out.println("枚舉類(lèi)餓漢式(防止反序列化):Hello World!");
    }
}

調(diào)用方式:

SingletonSix singleton = SingletonSix.INSTANCE;
singleton.say();

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

優(yōu)點(diǎn): 實(shí)現(xiàn)簡(jiǎn)單,防止反序列化生成多個(gè)實(shí)例,且線(xiàn)程安全。
缺點(diǎn): Enum 需在JDK1.5之后版本使用。

單例模式的優(yōu)缺點(diǎn) 優(yōu)點(diǎn)

單例模式在內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存開(kāi)支,尤其是頻繁的創(chuàng)建和銷(xiāo)毀實(shí)例。

由于只生成一個(gè)實(shí)例,所以減少了系統(tǒng)的性能開(kāi)銷(xiāo)。

避免對(duì)資源的多重占用,例如寫(xiě)文件操作。

單例模式可以在系統(tǒng)設(shè)置全局的訪問(wèn)點(diǎn),優(yōu)化和共享資源訪問(wèn)。

缺點(diǎn)

單例模式不易擴(kuò)展,若要擴(kuò)展,除了修改代碼外別無(wú)他法。

單例模式對(duì)測(cè)試不利。

單例模式與單一職責(zé)原則有沖突,一個(gè)類(lèi)應(yīng)該只實(shí)現(xiàn)一個(gè)邏輯,而不用關(guān)心它是否是單例的。

資源

源碼

參考

《設(shè)計(jì)模式之禪》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/7120.html

相關(guān)文章

  • Java設(shè)計(jì)模式單例模式單例六種實(shí)現(xiàn)

    摘要:?jiǎn)卫J降膬?yōu)缺點(diǎn)優(yōu)點(diǎn)單例模式在內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存開(kāi)支,尤其是頻繁的創(chuàng)建和銷(xiāo)毀實(shí)例。單例模式對(duì)測(cè)試不利。單例模式與單一職責(zé)原則有沖突,一個(gè)類(lèi)應(yīng)該只實(shí)現(xiàn)一個(gè)邏輯,而不用關(guān)心它是否是單例的。資源源碼參考設(shè)計(jì)模式之禪原文地址:xeblog.cn/articles/16 單例模式的定義 確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。 UML類(lèi)圖 showImg(ht...

    番茄西紅柿 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式單例模式單例六種實(shí)現(xiàn)

    摘要:?jiǎn)卫J降膬?yōu)缺點(diǎn)優(yōu)點(diǎn)單例模式在內(nèi)存中只有一個(gè)實(shí)例,減少了內(nèi)存開(kāi)支,尤其是頻繁的創(chuàng)建和銷(xiāo)毀實(shí)例。單例模式對(duì)測(cè)試不利。單例模式與單一職責(zé)原則有沖突,一個(gè)類(lèi)應(yīng)該只實(shí)現(xiàn)一個(gè)邏輯,而不用關(guān)心它是否是單例的。資源源碼參考設(shè)計(jì)模式之禪原文地址:xeblog.cn/articles/16 單例模式的定義 確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。 UML類(lèi)圖 showImg(ht...

    Caicloud 評(píng)論0 收藏0
  • 單例模式

    摘要:第二種懶漢式線(xiàn)程不安全對(duì)象為空才去實(shí)例化懶漢式是在使用的時(shí)候才會(huì)去加載,不過(guò)當(dāng)多次同時(shí)去加載的時(shí)候就會(huì)存在線(xiàn)程安全問(wèn)題。 單例模式,是一種常用的軟件設(shè)計(jì)模式,在它的核心結(jié)構(gòu)中只包含一個(gè)被稱(chēng)為單例的特殊類(lèi),通過(guò)單例模式可以保證系統(tǒng)中一個(gè)類(lèi)只有一個(gè)實(shí)例。即一個(gè)類(lèi)只有一個(gè)對(duì)象實(shí)例。 第一種:餓漢式 public class SingleEasy { private SingleEas...

    darkbug 評(píng)論0 收藏0
  • Java設(shè)計(jì)模式優(yōu)化-單例模式

    摘要:?jiǎn)卫J礁攀鰡卫J绞且环N對(duì)象創(chuàng)建模式,用于產(chǎn)生一個(gè)類(lèi)的具體事例。所以解決了線(xiàn)程安全問(wèn)題參考失效原因和解決方案中單例模式的缺陷及單例的正確寫(xiě)法懶漢式靜態(tài)內(nèi)部類(lèi)私有構(gòu)造器獲取單例的方法靜態(tài)內(nèi)部類(lèi)持有單例作為靜態(tài)屬性。 單例模式概述 單例模式是一種對(duì)象創(chuàng)建模式,用于產(chǎn)生一個(gè)類(lèi)的具體事例。使用單例模式可以確保整個(gè)系統(tǒng)中單例類(lèi)只產(chǎn)生一個(gè)實(shí)例。有下面兩大好處: 對(duì)于頻繁創(chuàng)建的對(duì)象,節(jié)省初第一...

    eccozhou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<