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

資訊專欄INFORMATION COLUMN

開發(fā)之路(設(shè)計模式五:單件模式)

Steven / 1623人閱讀

摘要:單件模式提供這個實例的全局訪問點。實現(xiàn)單件模式,需要私有構(gòu)造器,一個靜態(tài)方法,一個靜態(tài)變量。設(shè)計到多線程問題,同步會降低程序效率。

擁有獨立且唯一的對象

這次講述的是單件模式,就是整個內(nèi)容里只有一個實例化“唯一”對象。這么說可能有點拗口,這么說吧,比方說,線程池,緩存,注冊表,日志文件,甚至做JDBC中連接,關(guān)閉,增刪改查數(shù)據(jù)庫的Connection類(個人命名也許并不一樣)、工具類等等。這些東西往往是要實例一次,就能在整個項目中使用了。

單件模式并不難理解定義如下
單件模式:確保一個類中只有一個實例,并提供一個全局訪問點。
是的就這么一句話的定義。一般單件模式分為“懶漢式”和“餓漢式”做法

直接上代碼。

“懶漢式”做法

package singleton01;

public class Singleton01 {
    // 利用一個靜態(tài)變量記錄本類當(dāng)中唯一的實例(mySingleton01)
    private  static Singleton01 mySingleton01 = null;

    public Singleton01() {
    }

    // synchronized關(guān)鍵字:線程同步鎖,在多線程中去互斥地訪問臨界資源
    // 迫使每個線程在進(jìn)入方法之前,要先等別的線程執(zhí)行完離開方法后才能執(zhí)行,達(dá)到多個線程排隊,不會造成有多個線程同時進(jìn)入這個方法
    // 即是同步。但同步會使程序效率降低
    public static synchronized Singleton01 getInstance() {
        if (mySingleton01 == null) {
            mySingleton01 = new Singleton01();
            System.out.println("Singleton01被實例化了");
        }
        System.out.println("返回Singleton01實例");
        return mySingleton01;
    }
    /**
     * 上面方法就是常說了“懶漢式”做法,大體意思就是當(dāng)誰需要類方法時采取實例化
     */
}
package singleton01;

public class TestMain {
    public static void main(String[] args) {
        // 打印出前兩行結(jié)果
        Singleton01 singleton01 = Singleton01.getInstance();

        // 此時我們看到第二次調(diào)用類方法時候,沒有去實例對象
        // 這里涉及并發(fā)方面問題,暫時沒學(xué)習(xí)并發(fā),具體怎么個原理我也不知道...
        Singleton01 singleton02 = Singleton01.getInstance();
    }
}

效果圖1

效果圖2

之前的做法中我們用到了synchronized,就是為了防止線程啟動的隨機(jī)性找出變量混亂,我這個小例子可能看不出來什么。但實際上同步線程(synchronized)會使得程序效率大幅降低。利用雙重檢查加鎖可以有效解決此問題,

使用雙重檢查加鎖

package singleton01;

public class singleton02 {
    // 利用雙重檢查加鎖,先檢查實例是否已經(jīng)創(chuàng)建,如果沒創(chuàng)建,就進(jìn)行同步。
    // volatile:instance變量被初始化singleton02實例時,多個線程會正確處理instance變量
    // 線程是具有隨機(jī)性的,與程序執(zhí)行順序無關(guān)。
    private volatile static singleton02 instance=null;

    public singleton02() {        
    }

    public static singleton02 getInstance() {
        if (instance == null) {
            // 檢查實例,不存在的話進(jìn)入同步區(qū)域,只有第一次才執(zhí)行這里
            synchronized (singleton02.class) {
                System.out.println("進(jìn)入同步區(qū)域");
                if (instance == null) {
                    System.out.println("instance被實例化了");
                    instance = new singleton02();
                }
            }
        }
        System.out.println("返回instance實例");
        return instance;
    }
}
package singleton01;

public class TestMain02 {
    public static void main(String[] args) {
        //第一次進(jìn)入方法會進(jìn)入同步區(qū)實例化
        singleton02 singleton02 = null;
        singleton02 = singleton02.getInstance();
        
        //當(dāng)?shù)诙芜M(jìn)入時,已有實例,不會同步了,直接返回實例.
        singleton02 singleton03 = null;
        singleton03 = singleton02.getInstance();    
    }

}

效果圖

"餓漢式"做法

package singleton02;

public class Singleton {
    /**
     * “餓漢式”:加載這個類時立刻創(chuàng)建本類中唯一的單件實例,
     */
    private static Singleton uniqueInstance = new Singleton();

    private Singleton() {

    }

    public static Singleton getInstance() {
        System.out.println("返回實例實例");
        return uniqueInstance;
    }
}
package singleton02;

public class TestMain {
    public static void main(String[] args) {
        //直接返回實例
        Singleton singleton = Singleton.getInstance();
    }
}

效果圖

注:雙重檢查加鎖不適用與1.4之前的java版本。

要點:
1、單件模式確保程序中一個類最多只有一個實例。
2、單件模式提供這個實例的全局訪問點。
3、實現(xiàn)單件模式,需要私有構(gòu)造器,一個靜態(tài)方法,一個靜態(tài)變量。
4、設(shè)計到多線程問題,同步會降低程序效率。

感謝你看到這里,至此單件模式內(nèi)容結(jié)束,本人文筆隨便,若有不足或錯誤之處望給予指點,90度彎腰~~~很快我會發(fā)布下一個設(shè)計模式內(nèi)容,生命不息,編程不止!

參考書籍:《Head First 設(shè)計模式》

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

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

相關(guān)文章

  • 設(shè)計模式——單件模式

    摘要:簡介單件模式也叫單例模式,是一種創(chuàng)建型模式。類圖中類變量持有唯一的單件實例,是靜態(tài)方法,可以通過類名在任何需要的地方使用它,與訪問全局變量一樣,但是可以延遲實例化。 1. 簡介 ??單件模式(Singleton)也叫單例模式,是一種創(chuàng)建型模式。它確保一個類只有一個實例,并提供全局訪問。 2. UML類圖 showImg(https://segmentfault.com/img/bVb...

    testHs 評論0 收藏0
  • 夕陽下, 那是我在奔跑——單件模式

    摘要:急切的創(chuàng)建對象餓漢式以上爲(wèi)?zhàn)I漢式單列設(shè)計,該設(shè)計是線程安全的,即不同的線程在調(diào)用時返回的是統(tǒng)一對象,在加載這個類時,馬上創(chuàng)建了這個類的唯一單列實列。 單件模式(JAVA實現(xiàn)) 定義 單件模式: 確保一個類只有一個實列, 並提供一個全局訪問點 單件模式和全局變量的區(qū)別 若將對象賦值給一個全局變量, 則該對象需在程序開始時就創(chuàng)建好, 而改對象可能不會使用, 造成資源浪費, 而單件模式支持...

    lieeps 評論0 收藏0
  • 常見設(shè)計模式的定義,應(yīng)用場景和方法

    摘要:命令模式的由來,其實是回調(diào)函數(shù)的一個面向?qū)ο蟮奶娲?,命令模式早已融入到了語言之中。 模式是對某情景下,針對某種問題的某種解決方案。而一個設(shè)計模式是用來解決一個經(jīng)常出現(xiàn)的設(shè)計問題的經(jīng)驗方法。這么說來,每個模式都可能有著自己的意圖,應(yīng)用場景,使用方法和使用后果。本文的行文思路和目的皆在于了解各個模式的定義,應(yīng)用場景和用實例說明如何在前端開發(fā)中使用。 本文所設(shè)計到的概念和實例大多來自《H...

    xuxueli 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<