構造私有化和單例設計模式
阿新 • • 發佈:2018-01-14
靜態方法 內部 size 外部 定義 oid data 常用 out
以下的代碼對構造方法進行了私有化封裝,但這樣封裝後我們在類外需要實例化對象是會出現錯誤,因為構造方法是私有的,所以無法實例化。
1 class Singleton{
2 private Singleton() {}
3 public void print() {
4 System.out.println("hello world");
5 }
既然在外部不能實例化對象,我們可以在類的內部實例化對象。
1 class Singleton {
2 // 在類的內部進行實例化對象
3 private static Singleton instance = new Singleton();
4 // 獲得instance屬性
5 public static Singleton getInstance() {
6 return instance;
7 }
8 private Singleton() {} // 對構造函數進行了私有化封裝
9
10 public void print() {
11 System.out.println("hello world");
12 }
13 }
也因為外部不能實例化對象,我們如果要使用instance屬性,就應該把它定義為static類型,此時我們就可以在外部調用 getInstance()方法來實例化Singleton類型對象了。但這樣做有什麽用了,但我們實例化多個Singleton對象時,可以看到,s1、s2、s3其實指向的是同一個Singleton對象。
1 public class DataTest {
2 public static void main(String args[]) {
3 Singleton s1 = Singleton.getInstance();
4 Singleton s2 = Singleton.getInstance();
5 Singleton s3 = Singleton.getInstance();
6 }
7 }
也就是說不管外部聲明了多少個Singleton對象,最終結果都是通過調用getInstance()方法取得的實例化對象,即s1、s2、s3實際上都使用了一個對象的引用:instance。
那麽這樣的設計在設計模式上來講叫做單例設計模式(單態設計模式)。
單例設計模式的核心是將類的構造方法私有化,之後在類的內部產生實例化對象,並通過類的靜態方法返回實例化對象的引用。
如果現在不希望一個類產生過多的對象時,就可以采用單例設計模式。這在Java支持的類庫中會經常用到。
構造私有化和單例設計模式