一、问题场景
针对唯一递增ID号码生成器,如果需要时就直接创建一个ID对象,当程序中有两个对象,那就会存在生成重复ID的情况,此外频繁创建ID对象,也会消耗内存空间。
二、问题分析
ID生成器类是全局使用的类,会被频繁创建和销毁,为了节省内存空间,就要控制创建对象的数量,保证一个类只有一个对象,并提供一个全局的访问点。这就是创建型设计模式中的单例模式。
三、单例定义
单例设计模式指一个类只允许创建一个对象,并提供一个全局访问该对象的静态方法。
四、单例实现方式
为了保证这个对象只有一个,不能被外部程序创建,这个对象的构造函数必须是私有的,只能当前类内部创建。
1、饿汉式
public class SingleTon {
/**
* 将构造器私有化,防止直接new
*/
private SingleTon(){
}
/**
* 方式一:静态常量方式
* SingleTon对象实例在定义静态常量时创建
* 在类装载时就完成实例化
*/
private static SingleTon instance = new SingleTon();
// /**
// * 方式二: 静态代码块方式
// * SingleTon对象实例的创建放在静态代码块中
// * 当类装载的时候,就执行静态代码块中的代码,初始化SingleTon对象
// */
// private static SingleTon instance;
// static {
// instance = new SingleTon();
// }
/**
* 提供一个public的静态方法,返回instance
* @return
*/
public static SingleTon getInstance(){
return instance;
}
}
在类加载时创建并初始化好对象。这种创建是线程安全的,不过不支持延迟加载。
结论:不推荐实际开发中使用
2、懒汉式
public class SingleTonLazyLoading {
/**
* 将构造器私有化,防止直接new
*/
private SingleTonLazyLoading()