1. 程式人生 > >從訪問修飾符的角度看單例模式

從訪問修飾符的角度看單例模式

自己終於還是進入到設計模式這個領域了,比自己想象的快了一些。以前也學過、瞭解過一些模式,但看了之後又,本科畢業找工作面試的時候會看一下單例(這個最常考),但背過之後又會忘記,完全寫不處程式碼來。後來自己反思了一下,是自己的Java基礎不到位,就和高中學數學一樣,對於同一個題目,一般學生能找出1一條有用資訊,對於優生來說,往往能得到好幾個有用的資訊,Java也是同樣的道理,學習就是要多看(書、優秀的程式碼)、多練(寫程式碼)、多反思多總結(記筆記,寫部落格等方式)。

不多廢話,進入正題:記得我參加的第一個面試時,面試官說單例模式有7中寫法,我當時只知道餓漢式和懶漢時,由於複習的緣故,當時應該是寫出來了。不過後來早忘記了。今天我們從修飾符入手,擼一擼單例模式。

什麼是單例模式?可以這樣說,只產生一個物件的方法,叫做單例模式,它的核心是隻產生一個例項物件。我們來看第一個例子:

class Soup1{
    private Soup1 (){}
    public static Soup1 makeSoup(){

        return new Soup1();
    }


}

有了訪問修飾符和static關鍵字的知識後,這段程式碼就不難理解了:Soup1類有一個private修飾的預設構造方法(註釋1),private意味著只能在這個類裡面使用這個構造方法產生一個Soup1物件,所以在其他類中就不能使用Soup1 Soup1Instance = new Soup1()模式來建立物件了;但是Soup1又提供了一個public的、靜態的、返回值型別為Soup1的空參方法makeSoup(),由於被static修飾的方法可以在不建立類物件時被呼叫,這裡可以用類去呼叫Soup1.makeSoup(),這樣就返回了一個Soup1例項物件的應用了。

有了以上的知識,我們來看看Soup2類

class Soup2{

    private Soup2(){}

    private static Soup2 sp = new Soup2();
    public static Soup2 getInstance(){
        return sp;
    
    }
    public void f(){}
}

Soup2類的物件是作為Soup2的一個static private(靜態私有)成員而建立的,所以有且只有一個物件,為什麼只有一個物件,因為被static修飾了,建立的例項只有一個。

註釋1處說明:誰說預設的構造方法就必須是public?只要是空參的構造方法就叫做預設構造方法,如果類沒有構造方法,編譯器會幫你建一個預設構造器(不帶任何引數),如果已經編寫了預設構造器,那麼就不會再建立它了。(《Java程式設計思想》第四版,原文122頁原話)