国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

開發(fā)之路(設(shè)計(jì)模式五:?jiǎn)渭J剑?

Steven / 1619人閱讀

摘要:?jiǎn)渭J教峁┻@個(gè)實(shí)例的全局訪問點(diǎn)。實(shí)現(xiàn)單件模式,需要私有構(gòu)造器,一個(gè)靜態(tài)方法,一個(gè)靜態(tài)變量。設(shè)計(jì)到多線程問題,同步會(huì)降低程序效率。

擁有獨(dú)立且唯一的對(duì)象

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

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

直接上代碼。

“懶漢式”做法

package singleton01;

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

    public Singleton01() {
    }

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

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

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

效果圖1

效果圖2

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

使用雙重檢查加鎖

package singleton01;

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

    public singleton02() {        
    }

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

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

}

效果圖

"餓漢式"做法

package singleton02;

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

    private Singleton() {

    }

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

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

效果圖

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

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

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

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/70259.html

相關(guān)文章

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

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

    testHs 評(píng)論0 收藏0
  • 夕陽(yáng)下, 那是我在奔跑——單件模式

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

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

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

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

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

0條評(píng)論

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