天天看點

構造方法私有化及單态設計模式

構造方法私有化,也就是,說構造方法是私有的。比如:

class Singleton{
    private Singleton(){}//構造方法進行了封裝,私有化
    public void print (){
        System.out.println("Hello World!");
}
};
           

我們不能在外部執行個體化這個Singleton對象的類!比如:

public class SingletonDemo02{
    public static void main(String args[]){
    Singleton s1=null;//聲明對象
    s1=new singleton();//錯誤,無法執行個體化對象
    }
}
           

如果我們想要在Singleton類的外部類中使用Singleton類對象的話,隻能再Singleton類中執行個體化一個Singleton類的對象,并将執行個體化對象聲明為static類型,這樣就可以通過類名直接通路。如下:

class Singleton{
    static Singleton instance = new Singleton() ;   // 在内部産生本類的執行個體化對象
    private Singleton(){        // 将構造方法進行了封裝,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};
public class SingletonDemo04{
    public static void main(String args[]){
        Singleton s1 = null ;   // 聲明對象
        s1 = Singleton.instance ;   // 取得執行個體化對象
        s1.print() ;        // 調用方法
    }
};
           

以上代碼還不是最優的,屬性最好被封裝,是以instance最好被聲明為private,然後通過靜态方法來取得instance對象。

class Singleton{
    private static Singleton instance = new Singleton() ;   // 在内部産生本類的執行個體化對象
    public static Singleton getInstance(){      // 通過靜态方法取得instance對象
        return instance ;
    }
    private Singleton(){        // 将構造方法進行了封裝,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};
public class SingletonDemo05{
    public static void main(String args[]){
        Singleton s1 = null ;   // 聲明對象
        s1 = Singleton.getInstance() ;  // 取得執行個體化對象
        s1.print() ;        // 調用方法
    }
};
           

那麼這樣做有什麼好處呢?請先看下面一段代碼:

class Singleton{
    private static Singleton instance = new Singleton() ;   // 在内部産生本類的執行個體化對象
    public static Singleton getInstance(){      // 通過靜态方法取得instance對象
        return instance ;
    }
    private Singleton(){        // 将構造方法進行了封裝,私有化   
    }
    public void print(){
        System.out.println("Hello World!!!") ;
    }
};
public class SingletonDemo05{
    public static void main(String args[]){
        Singleton s1 = null ;   // 聲明對象
        Singleton s2 = null ;   // 聲明對象
        Singleton s3 = null ;   // 聲明對象
        s1 = Singleton.getInstance() ;  // 取得執行個體化對象
        s2 = Singleton.getInstance() ;  // 取得執行個體化對象
        s3 = Singleton.getInstance() ;  // 取得執行個體化對象
        s1.print() ;        // 調用方法
        s2.print() ;        // 調用方法
        s3.print() ;        // 調用方法
    }
};
           

不管外部聲明了多少個Singleton的對象,但是最終結果都是通過getInstance()方法取得的執行個體對象,也就是說,此時s1、s2、s3實際上都使用了一個對象的引用:instance

構造方法私有化及單态設計模式

那麼這樣的設計在設計模式上來講就屬于單态(單例)設計模式。如果在開發中不希望一個類産生過多的對象的話,則必須使用單态設計模式。

所謂的單态就是在入口處(構造方法)限制了對象的執行個體化操作。