天天看点

构造方法私有化及单态设计模式

构造方法私有化,也就是,说构造方法是私有的。比如:

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

构造方法私有化及单态设计模式

那么这样的设计在设计模式上来讲就属于单态(单例)设计模式。如果在开发中不希望一个类产生过多的对象的话,则必须使用单态设计模式。

所谓的单态就是在入口处(构造方法)限制了对象的实例化操作。