溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java單例模式如何實(shí)現(xiàn)

發(fā)布時(shí)間:2021-12-27 17:44:48 來(lái)源:億速云 閱讀:117 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“java單例模式如何實(shí)現(xiàn)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“java單例模式如何實(shí)現(xiàn)”吧!

0x01 宮女請(qǐng)安

在朕的后宮中,皇后當(dāng)之無(wú)愧的是天下第一(朕只能當(dāng)?shù)诙?,為了彰顯皇后在后宮的地位,每日早晨,宮女必須向皇后娘娘請(qǐng)安。

一大群宮女每天都要來(lái)向皇后請(qǐng)安,皇后每天也要接見(jiàn)這群小妹妹們。由于皇后的唯一性,眾妹妹在請(qǐng)安的時(shí)候都會(huì)大呼“皇后娘娘千歲!”,注意,大家稱(chēng)呼的是皇后娘娘,而不是張皇后、李皇后什么的。天天向一個(gè)皇后請(qǐng)安,也就不會(huì)把自己弄迷糊了。這點(diǎn)在設(shè)計(jì)領(lǐng)域中就要求,一個(gè)類(lèi)只能生成一個(gè)對(duì)象。

那么怎么來(lái)實(shí)現(xiàn)呢?對(duì)象的產(chǎn)生是通過(guò)new關(guān)鍵字完成的(這是主要方式),這個(gè)怎么來(lái)控制呢?構(gòu)造函數(shù)!在使用new關(guān)鍵字創(chuàng)建對(duì)象的時(shí)候,都會(huì)根據(jù)輸入?yún)?shù)調(diào)用相應(yīng)的構(gòu)造函數(shù),如果我們把皇后的構(gòu)造函數(shù)設(shè)置成private私有訪問(wèn)權(quán)限是不是就可以禁止外部創(chuàng)建對(duì)象了?

下圖就是宮女向唯一的皇后請(qǐng)安的過(guò)程。

java單例模式如何實(shí)現(xiàn)

只有兩個(gè)類(lèi):Queen代表皇后,Maid代表宮女。

1.代碼清單 皇后類(lèi)
public class Queen {
    private static final Queen queen = new Queen();
    private Queen() {

    }
    public static Queen getInstance() {
        return queen;
    }

    public static void say() {
        System.out.println("本宮是yyj,爾等跪安吧~");
    }
}

通過(guò)定義一個(gè)私有訪問(wèn)權(quán)限的構(gòu)造函數(shù),避免被其他類(lèi)new出來(lái)一個(gè)對(duì)象,而Queen自己則可以new一個(gè)對(duì)象出來(lái),其他類(lèi)對(duì)該類(lèi)的訪問(wèn)都可以通過(guò)getInstance獲得同一個(gè)對(duì)象。

現(xiàn)在皇后有了,宮女要出場(chǎng)了。

2.代碼清單 宮女類(lèi)
public class Maid {
    public static void main(String[] args) {
        for(int i = 1 ; i < 4; i++) {
            Queen queen = Queen.getInstance();
            System.out.println("今天是第 " + i + " 天請(qǐng)安!");
            queen.say();
        }
    }
}

宮女請(qǐng)安的運(yùn)行結(jié)果如下所示。

今天是第 1 天請(qǐng)安!
本宮是yyj,爾等跪安吧~
今天是第 2 天請(qǐng)安!
本宮是yyj,爾等跪安吧~
今天是第 3 天請(qǐng)安!
本宮是yyj,爾等跪安吧~

宮女每天向皇后請(qǐng)安,每天抬頭一看,呦,老熟人了,還是昨天那個(gè)皇后,這就是單例模式!

0x02 單例模式

1.概念

單例模式(Singleton Pattern)是一個(gè)比較簡(jiǎn)單的模式,其定義如下:

Ensure a class has only one instance, and provide a global point of access to it.(確保某一個(gè)類(lèi)只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。)

2.構(gòu)建方式

通常單例模式在Java語(yǔ)言中,有兩種構(gòu)建方式:

懶漢方式。指全局的單例實(shí)例在第一次被使用時(shí)構(gòu)建。 餓漢方式。指全局的單例實(shí)例在類(lèi)裝載時(shí)構(gòu)建。

3.代碼清單 餓漢模式
 public class Singleton {
    private final static Singleton INSTANCE = new Singleton();

    // Private constructor suppresses   
    private Singleton() {}

    // default public constructor
    public static Singleton getInstance() {
        return INSTANCE;
    }
  }
4.代碼清單 懶漢模式
public class Singleton {
    private static volatile Singleton INSTANCE = null;

    // Private constructor suppresses 
    // default public constructor
    private Singleton() {}

    //thread safe and performance  promote 
    public static  Singleton getInstance() {
        if(INSTANCE == null){
             synchronized(Singleton.class){
                 //when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be checked again.
                 if(INSTANCE == null){ 
                     INSTANCE = new Singleton();
                  }
              } 
        }
        return INSTANCE;
    }
  }

到此,相信大家對(duì)“java單例模式如何實(shí)現(xiàn)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI