单例模式的作用是保证整个应用程序的生命周期中,任何一个时刻,单例类的实例都只存在一个(也可以不存在)。
单例模式确保某一个类只有一个实例,而且自行实例化,并向整个系统提供这个实例单例模式只应在有真正的‘单一实例’需求时才可使用。
全局变量和单例模式的区别为:
- 全局变量是对一个对象的静态引用,全局变量确实可以提供单例模式实现的全局访问这个功能,但是它并不能保证应用程序中只有一个实例;
- 编码规范也明确指出应该要少用全局变量,因为过多使用全局变量,会造成代码难度;
- 全局变量并不能实现继承(虽然单例模式在继承上也能很好地处理,但是还可以实现继承的)。而单例模式在类中保存了它的唯一实例,这个类它可以保证只能创建一个实例,同时它还提供了一个访问该唯一实例的全局访问点。
单例类的构造函数必须为私有的,同时单例类必须提供一个全局访问点。
静态内部类单例模式:
public class Singleton{
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
/*静态内部类*/
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
}
当第一次加载Singleton类时并不会初始化instance,只有在第一次调用Singleton的getInstance方法时才会导致instance被初始化,因此第一次调用getInstance方法会导致 虚拟机加载SingletonHolder类,这种方式不仅能够确保线程安全,也能够保证单例对象的唯一性,同时也延迟了单例的实例化,所以这是推荐使用的单例模式实现方式。
网友评论