构造方法私有化 ---> 单例设计模式
一个类想要使用必须具有实例化对象(instance),但是如果构造方法私有化之后,在类的外部是无法调用构造方法来实例化对象的,如下代码:
class Singleton {
private Singleton(){}
public void print(){
System.out.println("It is singleton!");
}
}
public class SingletonDemo{
public static void main(String args[]){
Singleton instance = null; //可以声明对象
instance = new Singleton(); //error, 因为构造方法私有化,无法实力化对象
s.print();
}
}
2.构造方法私有化之后,在类的外部是无法通过调用构造方法来实例化对象,但是在类的内部呢,可以吗?如下代码:
class Singleton {
Singleton instance = new Singleton();
private Singleton(){}
public void print(){
System.out.println("It is singleton!");
}
}
3.以上代码编译时正确的,那么此时的重点就是如何将内部的instance传递到类的外部去,这样在类的外部就可以通过instance来实例化Singleton的对象,该如何获取呢?使用static来修饰instance属性,这样就可以通过类名称直接调用instance属性,代码如下:
class Singleton {
static Singleton instance = new Singleton();
private Singleton(){}
public void print(){
System.out.println("It is singleton!");
}
}
public class SingletonDemo{
public static void main(String args[]){
Singleton instance = null; //声明对象
instance = Singleton.instance; //实力化对象
instance.print(); //打印信息:It is singleton!
}
}
4.以上代码可以正确执行,但是在类的设计中,我们应该注意对于类的属性我们应该进行封装,即private关键字修饰,此时在类的外部Single.instance是无法访问成功的,那么 此时就应该通过getter方法来访问类中被封装的属性instance,由于instance使用了static修饰,所以此时该方法应该是static方法,代码如下:
class Singleton {
private static Singleton instance = new Singleton();
private Singleton(){}
//饿汉式,获取实例化对象instance
public static Singleton getInstance(){
return instance;
}
public void print(){
System.out.println("It is singleton!");
}
}
public class SingletonDemo{
public static void main(String args[]){
Singleton s1 = Singleton.getInstance(); //访问类中的静态方法,取得对象实例
Singleton s2 = Singleton.getInstance(); //访问类中的静态方法,取得对象实例
Singleton s3 = Singleton.getInstance(); //访问类中的静态方法,取得对象实例
s1.print(); //打印信息:It is singleton!
s2.print(); //打印信息:It is singleton!
s3.print(); //打印信息:It is singleton!
}
}
以上程序中虽然声明了3个singleton对象,但是这三个对象都是指向了同一个instance引用,即本质上只有一个实例化对象的存在,这种设计模式称作单例设计模式。内存图:
当然,单例设计模式有懒汉式与饿汉式,上述例子中是饿汉式,下面给出懒汉式代码:
class Singleton {
private static Singleton instance = null;
private Singleton(){}
//懒汉式,获取实例化对象instance
public static Singleton getInstance(){
if (instance == null){
instance = new Singleton();
}
return instance;
}
public void print(){
System.out.println("It is singleton!");
}
}
最后,需要知道,只要将构造方法私有化,就可以控制实例化对象的产生。