1. 程式人生 > >JavaSE之單例設計模式&多例設計模式

JavaSE之單例設計模式&多例設計模式

單例模式

單例模式設計指的是一個類只允許產生一個例項化物件。單例設計模式有兩種形式:懶漢式、餓漢式。 那麼怎麼才能使一個類只產生一個例項化物件呢?我們先從它的實現上來考慮,一個類進行例項化的時候是通過呼叫建構函式來實現的,一般我們用public訪問許可權來修飾建構函式,想定義多少個物件就定義多少個物件。但是現在要只產生一個例項化物件,我們就聯想到,將它的訪問許可權修改為private,不允許類外部訪問,只允許類內部訪問。也就是說private修飾建構函式之後,我們不能在類外面進行物件例項化,只能在類裡面進行物件例項化 Singleton SINGLENTON=new Singleton();。但是此時類的物件(屬性)是一個普通屬性,所有的普通屬性必須在有例項化物件的時候才能進行記憶體空間的分配

,而現在外部無法產生例項化物件,所以必須想一個辦法,可以在類沒有例項化物件產生的時候,也可以使用SINGLENTON。此時,就聯想使用static關鍵字。**static修飾的靜態物件變數在類載入的時候就已經對物件進行例項化,分配記憶體。**為了實現只產生一個例項化物件,SINGLENTON這個屬性自然也是要private來修飾,對外部不可見,一般還會追加一個final關鍵字。要想取得private屬性也應該提供getter()方法,由於此時訪問的是static屬性,並且這個類無法在外部提供例項化物件,因此應該提供一個static的getter()方法,因為static方法也不受物件例項化控制。具體實現看下面程式碼:

餓漢式單例:上來就new

class Singleton{
    //類內進行物件例項化
    private final static  Singleton SINGLENTON=new Singleton();
    //private修飾建構函式,此時建構函式只能在類內訪問不能在類外訪問
    private Singleton(){};
    //靜態的獲得例項化後的物件的函式
    public static Singleton GetSinglenton(){
        return SINGLENTON;
    }
}
public class Test {
    public static void main(String[] args) {
       Singleton sin1=Singleton.GetSinglenton();
        Singleton sin2=Singleton.GetSinglenton();
        Singleton sin3=Singleton.GetSinglenton();
        System.out.println(sin1);//
[email protected]
System.out.println(sin2);//[email protected] System.out.println(sin3);//[email protected] } }

懶漢式單例:用時再new(雙重加鎖單例模式)

class Singleton{
    //宣告一個類物件
    private static Singleton SINGLENTON;
    //構造方法
    private Singleton(){};
    //對物件進行例項化,並且返回例項化後的物件
    public static Singleton GetSinglenton(){
        if(SINGLENTON==null){
            SINGLENTON=new Singleton();
        }
        return SINGLENTON;
    }
}
public class Test {
    public static void main(String[] args) {
       Singleton sin1=Singleton.GetSinglenton();
        Singleton sin2=Singleton.GetSinglenton();
        Singleton sin3=Singleton.GetSinglenton();
        System.out.println(sin1);
        System.out.println(sin2);
        System.out.println(sin3);
    }
}

餓漢式和懶漢式的區別

餓漢式:是在類載入的時候就已經產生例項化操作了 懶漢式:當第一次去適應類物件的時候才會為其產生例項化物件的操作。 一般我們都使用餓漢式單例模式而不採用懶漢式單例模式,因為懶漢式單例模式在多執行緒的時候會出現執行緒安全問題,至於我為什麼?我現在也不知道等我學習了多執行緒再回來補這個坑吧~~~~但是我知道雙重加速單例模式可以解決懶漢單例模式這個坑~感興趣的童鞋可以自己先了解了解 單例模式的特點:構造方法私有化,外部無法產生新的例項化物件,只能通過static方法取得例項化物件

多例設計模式

什麼是多例設計模式呢?假如要求描述一週數的類,只能有七個物件;描述性別的類,只能有兩個。這些都屬於多例設計模式(有限個數物件)。 所謂的多例只是比單例追加了更多個內部例項化物件產生而已。 範例:實現性別多例設計模式

class Sex{
    private String title;
    public static final int MALE_FLAG=1;
    public static final int FEMALE_FLAG=2;
    private static final Sex MALE=new Sex("男");
    private static final Sex FEMALE=new Sex("女");
    private Sex(String title){
        this.title=title;
    }
    public static Sex GetSex(int sex) {
       switch (sex) {
           case 1:
               return MALE;
           case 2:
               return FEMALE;
               default:
                   return null;
       }
    }
    public String toSting(){
        return this.title;
    }
}
public class Test {
    public static void main(String[] args) {
       Sex male=Sex.GetSex(Sex.MALE_FLAG);
        System.out.println(male.toSting());
    }
}

不管是多例還是單例都有共同特點: 1.構造方法私有化 2.類內部一定會提供一個static方法用於取得例項化物件 總結:單例和多例的程式碼我們編寫的機率並不高,但是對於程式碼結果我們一定要清楚,尤其是單例設計。多例設計模式我們先理解概念,該概念已經被列舉所取代。