所謂的單例設計指的是一個類只允許產生一個實例化對象。
範例:
以上程序在進行對象實例化的時候調用了Singleton的無參構造。
範例:使用private聲明構造方法
這個時候類中已經明確的提供了一個私有的構造方法,那麼默認生成的無參構造不再產生,此時進行對象實例化的
時候一定會有錯誤。
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
The constructor Singleton() is not visible
一旦構造方法被私有化了,表示外部無法調用構造即外部不能夠產生新的實例化對象。此時的類是一個相對而言封閉的狀態。
如果此時還想繼續調用Singleton類的print()方法,那麼必須提供實例化對象。考慮到封裝的特點,可以在類的內部
產生一個實例化對象。
範例:在類的內部產生實例化對象
現在Singleton內部的instance對象(屬性)是一個普通屬性,所有的普通屬性必須在有實例化對象的時候才能進行內存空間的分配,而現在外部無法產生實例化對象,所以必須想一個辦法,可以在Singleton沒有實例化對象產生的時候,也可以將instance進行使用。此時,聯想到使用static關鍵字。
範例:使用static產生實例化對象
以上雖然可以取得Singleton類的實例化對象,但是對於類中屬性應該使用private進行封裝,要想取得private屬性,應該提供getter()方法。由於此時訪問的是static屬性,並且這個類無法在外部提供實例化對象,因此應該提供一個static的getter()方法,因爲static方法也不受對象實例化控制。
範例:static的getter()方法
單例設計模式的終極目的:只希望類中產生唯一的一個實例化對象。
單例設計模式的特點:構造方法私有化,外部無法產生新的實例化對象,只能通過static方法取得實例化對象
對於單例設計模式也有兩類形式:懶漢式、餓漢式。
上面的代碼實際上就是餓漢式的應用。不管你是否使用Singleton類的對象,只要該類加載了,那麼一定會自動創建好一個公共的instance對象。既然是餓漢式,就希望整體的操作之中只能夠有一個實例化對象,所以一般還會在前面追加一個final關鍵字
範例:餓漢式單例模式
class Singleton{
// 在類的內部可以訪問私有結構,所以可以在類的內部產生實例化對象
private final static Singleton INSTANCE = new Singleton() ;
private Singleton() { // private聲明構造
}
public static Singleton getInstance() {
return INSTANCE ;
}
public void print() {
System.out.println("Hello World");
}
}
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton = null ; // 聲明對象
singleton = Singleton.getInstance() ;
singleton.print();
}
}
範例:懶漢式單例模式
特點:當第一次去使用Singleton對象的時候纔會爲其產生實例化對象的操作.
懶漢式存在多線程安全問題,而餓漢式不會。