分析:
1.爲了限制多個實例化對象的產生,我們使用private修飾構造方法,private 修飾符的特點是,當某方法被private修飾,外部類無法調用該方法,該方法只能被本類調用。所以當使用private 關鍵字修飾了本類的構造方法後,構造方法私有化,無法從外部進行構造方法的調用。此時,在不改變本類的情況下,如何能讓外部類得到該實例化對象?
2.解決的辦法是:在本類中實例化好該對象instance,此時內部聲明的instance屬性屬於一個普通屬性,訪問該屬性,就必須先實例化好本對象,然後通過本對象訪問該屬性,但現在外部無法實例化對象,此時我們考慮static關鍵字,因爲static不受實例化對象的控制。此時我們就以使用static 關鍵字來修飾該屬性。
3.類中的屬性一般都要使用private關鍵字進行封裝,當我們使用private 關鍵字封裝該屬性後,就需要提供靜態公有方法,讓外部類通過該靜態方法得到實例化對象。
4.但我們發現,上面的做法雖然限制了從外部類直接實例化對象,但通過本類,依然可以實例化多個對象,因此我們進一步使用final關鍵字修飾該instance屬性,以此達到對象只能被實例化一次的目的。
單例模式的核心思想在於:構造方法私有化,外部無法產生新的實例化對象,只能通過類提供的static 方法取得唯一的一個對象的引用,不管外部聲明瞭多少了對象,但實際只存在一個實例化對象。
其內存圖如下圖所示:
//單例設計模式
class Singleton{
private static final Singleton INSTANCE = new Singleton(); //實例化私有對象
public static Singleton getInstance(){ //提供訪問該私有化對象的靜態方法
return INSTANCE;
}
private Singleton(){} //構造方法私有化
public void sayTo(){
System.out.println("我是單例模式");
}
}
public class SingletonTest{
public static void main(String[] args){
Singleton instA = null; //聲明對象
Singleton instB = null;
Singleton instC = null;
instA = Singleton.getInstance(); //拿到私有化對象
instA.sayTo(); //調用sayTo()方法
instB = Singleton.getInstance();
instB.sayTo();
instC = Singleton.getInstance();
instC.sayTo();
}
}