模式思想
对一个类只实例化一次,并为这个实例提供一个全局的访问点
代码实现
- 定义单例类(Singleton.java)
- 饿汉式单例模式
package singleton;
public class Singleton {
// 自身的一个实例,在类装载的时候就实例化
private static Singleton instance = new Singleton();
// 私有构造函数,禁止外部通过 new 实例化
private Singleton() {
}
// 提供自身实例的全局访问点
public static Singleton getInstance() {
return instance;
}
public void showMessage() {
System.out.println("Hello world!");
}
}
- 登记式/内部静态类单例模式
public class Singleton {
// 在类装载的时候未必实例化
// 只有显示调用 getInstance() 才会实例化,即延迟加载效果
private static class SingletonHolder {
// 单例类的一个实例
private static final Singleton INSTANCE = new Singleton();
}
// 私有构造函数,禁止外部通过 new 实例化
private Singleton() {
}
// 提供自身实例的全局访问点
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
public void showMessage() {
System.out.println("Hello world!");
}
}
注意两种单例模式的区别:在单例类装载的时候,饿汉式立即实例化,而登记式/内部静态类方式只有在显示调用
getInstance()
方法时才会实例化,即实现了实例的延迟加载
- 调用单例类用于生产
import singleton.Singleton;
public class SingletonDemo {
public static void main(String[] args) {
Singleton singleton = Singleton.getInstance();
singleton.showMessage();
}
}