1. 程式人生 > >Java學習——單例模式

Java學習——單例模式

單例模式


特點:一個類只允許產生一個例項化物件

一個普通的類我們可以new出多個例項化物件,如何才能限制物件的個數呢?

產生物件的本質是我們呼叫了類的構造方法,如果我們無法呼叫構造方法不就不會產生例項化物件了嗎?最容易想到的就是將類的構造方法私有化。一旦構造方法被私有化了,表示外部無法呼叫構造即外部不能夠產生新的例項化物件。此時的類是一個相對而言封閉的狀態。但是我們還需要一個例項化物件啊,那麼我們可以在類中呼叫構造方法產生一個例項化物件,再通過靜態方法將這個物件返回給想要例項化物件的地方就行了。

對於單例設計模式也有兩類形式:懶漢式、餓漢式。

餓漢式單例

//餓漢式單例_先new為敬
class Singleton{
    private static final Singleton SINGLETON = new Singleton();//類內部例項化一個物件
    private Singleton(){}//構造方法私有化
    public static Singleton getSingleton(){//通過get方法返回
        return SINGLETON;
    }
    public void test(){
        System.out.println("This is singleton" + this);
    }
}

public class Test {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getSingleton();
        singleton.test();
    }
}

為什麼要使用static關鍵字修飾SINGLETON呢?

現在Singleton內部的SINGLETON物件(屬性)是一個普通屬性,所有的普通屬性必須在有例項化物件的時候才能進行記憶體空間的分配,而現在外部無法產生例項化物件,所以必須想一個辦法,可以在Singleton沒有例項化物件產生的時候,也可以將SINGLETON進行使用。此時,聯想到使用static關鍵字。

上面的程式碼實際上就是餓漢式的應用。不管你是否使用Singleton類的物件,只要該類載入了,那麼一定會自動建立好一個公共的SINGLETON物件。既然是餓漢式,就希望整體的操作之中只能夠有一個例項化物件,所以一般還會在前面追加一個final關鍵字。

懶漢式單例

//懶漢式單例——用時再new
class Singleton{
    private static  Singleton SINGLETON ;//類內部例項化一個物件
    private Singleton(){}//構造方法私有化
    public static Singleton getSingleton(){//通過get方法返回
        //延遲載入
        if(SINGLETON == null){
            SINGLETON = new Singleton();
        }
        return SINGLETON;
    }
    public void test(){
        System.out.println("This is singleton" + this);
    }
}
public class Test {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getSingleton();
        singleton.test();
    }
}

懶漢式單例的特點是:當第一次去使用Singleton物件的時候才會為其產生例項化物件的操作.

注意:懶漢式單例存線上程安全問題(解決方法:雙重加鎖單例模式)

無論單例還是多例,其特點為:

1.構造方法私有化

2.類內部提供靜態方法返回有限個數物件