分析:
1.为了限制多个实例化对象的产生,我们使用private修饰构造方法,private 修饰符的特点是,当某方法被private修饰,外部类无法调用该方法,该方法只能被本类调用。所以当使用private 关键字修饰了本类的构造方法后,构造方法私有化,无法从外部进行构造方法的调用。此时,在不改变本类的情况下,如何能让外部类得到该实例化对象?
2.解决的办法是:在本类中实例化好该对象instance,此时内部声明的instance属性属于一个普通属性,访问该属性,就必须先实例化好本对象,然后通过本对象访问该属性,但现在外部无法实例化对象,此时我们考虑static关键字,因为static不受实例化对象的控制。此时我们就以使用static 关键字来修饰该属性。
3.类中的属性一般都要使用private关键字进行封装,当我们使用private 关键字封装该属性后,就需要提供静态公有方法,让外部类通过该静态方法得到实例化对象。
4.但我们发现,上面的做法虽然限制了从外部类直接实例化对象,但通过本类,依然可以实例化多个对象,因此我们进一步使用final关键字修饰该instance属性,以此达到对象只能被实例化一次的目的。
单例模式的核心思想在于:构造方法私有化,外部无法产生新的实例化对象,只能通过类提供的static 方法取得唯一的一个对象的引用,不管外部声明了多少了对象,但实际只存在一个实例化对象。
其内存图如下图所示:
//单例设计模式
class Singleton{
private static final Singleton INSTANCE = new Singleton(); //实例化私有对象
public static Singleton getInstance(){ //提供访问该私有化对象的静态方法
return INSTANCE;
}
private Singleton(){} //构造方法私有化
public void sayTo(){
System.out.println("我是单例模式");
}
}
public class SingletonTest{
public static void main(String[] args){
Singleton instA = null; //声明对象
Singleton instB = null;
Singleton instC = null;
instA = Singleton.getInstance(); //拿到私有化对象
instA.sayTo(); //调用sayTo()方法
instB = Singleton.getInstance();
instB.sayTo();
instC = Singleton.getInstance();
instC.sayTo();
}
}