网上有很多单例模式的代码,之前也只是草草的知道单例模式怎么写,大概的用途。
今天看书《Java开发实战经典》的时候又看到了单例模式,根据自己的理解说明一下单例模式的实现步骤(过程):
1. ——>对构造方法的封装( private 类名() )
class Singleton{
private Singleton() { //对构造方法的封装
}
public void sayHello(){ //普通方法
System.out.println("Hello, Singleton");
}
}
通过私有化构造方法,外部不可调用构造方法生成本类对象。(所以下一步要解决如何生成本类对象?)
2. ——>在类内部生成本类对象
class Singleton{
Singleton instance = new Singleton(); //在内部生成本类对象
private Singleton() {
}
public void sayHello(){
System.out.println("Hello, Singleton");
}
}
虽然生成了本类对象,但如何把对象传递给外部使用呢?而外部又不能生成本类的实例获得,所以只能通过把想调用的成员变成类成员,然后通过类名称来直
接调用。所
以下一步就是将内部生成的对象变成类成员。
3. ——>添加static关键字使内部对象变成类成员
class Singleton
static Singleton instance = new Singleton(); //将内部对象变成类成员
private Singleton() {
}
public void sayHello(){
System.out.println("Hello, Singleton");
}
}
但是类中的属性必须封装,所以下一步要封装此内部对象。
4. ——>对类成员对象进行封装(private),不允许直接访问类属性
class Singleton
private static Singleton instance = new Singleton(); //对类成员对象进行封装
private Singleton() {
}
public void sayHello(){
System.out.println("Hello, Singleton");
}
}
到了这里,就很容易想到下一步应该是生成返回封装属性的方法了,不过因为此处的属性(内部生成的对象)是静态属性(类属性),所以获得这个属性的方法也要是静态方 法(可以使用类名直接调用的类方法)。
5. ——>生成返回封装后的静态成员对象的静态方法
class Singleton
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance(){ //用来获得静态属性的静态方法
return instance;
}
public void sayHello(){
System.out.println("Hello, Singleton");
}
}
到此一个完整的单例模式就完成了,可以被类名直接调用获得此类对象(e.g. Singleton s1 = Singleton.getInstance() )
即:无论程序怎样运行,Singleton类永远只会有一个实例化对象存在。
PS: 只要将构造方法私有化,就可以控制实例化对象的产生。(核心)