目录
类的封装性不止体现在对属性的封装,实际上方法也是可以封装的,构造方法私有化就是对构造方法进行封装
一 、问题引出
先有以下的封装:
class Singleton {
private Singleton() { //对构造方法进行封装
}
public void print() {
System.out.println("hello world!");
}
}
public class SingletonDemo1 {
public static void main(String[] args) {
Singleton s1 = new Singleton(); //错误,无法实例化
}
}
在主方法中实例化对象时,由于构造方法被封装,此时程序编译报错:
二 、问题的解决
以上程序在类的外部无法调用到类内部的私有构造方法进行实例化对象,那么,我们是否能在类内部实例化对象,之后再把对象传递到外部呢?所以解决问题的关键在于如何将内部实例化后的对象传递到类的外部去。
static 类型的属性可以由类名称直接调用,所以此时可以将类内部实例化的对象声明为 static 类型,在类的外部通过类名称直接调用。
class Singleton {
private static Singleton instance = new Singleton(); //声明 static 对象实例
public static Singleton getInstance() {
return instance;
}
private Singleton() { //对构造方法进行封装
}
public void print() {
System.out.println("hello world!");
}
}
public class SingletonDemo02 {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance(); //取得类中 static 对象实例
Singleton s2 = Singleton.getInstance(); //取得类中 static 对象实例
Singleton s3 = Singleton.getInstance(); //取得类中 static 对象实例
s1.print();
s2.print();
s3.print();
}
}
程序运行结果:
三 、程序的意义
以上代码将构造方法私有化之后,程序正常执行,代码比之前直接实例化对象复杂了一些,那么将构造方法实例化究竟有什么意义呢?
从以上程序中可以发现,虽然声明了3个Singleton对象,但实际上所有的对象都值使用 instance 引用,也就是说,不管类外部声明多少对象,最终只有一个实例化对象存在
在设计模式中,这样的设计成为 单例设计模式,无论程序怎么运行,构造方法私有化的类永远只有一个实例化对象存在,也就是说只要将构造方法私有化,就可以控制实例化对象的产生