单例模式是Java中最常用的模式之一,它通过阻止外部实例化和修改,来控制所创建的对象的数量。这个概念可以被推广到仅有一个对象能更高效运行的系统,或者限制对象实例化为特定的数目的系统中。例如:
1.私有构造函数 - 其他类不能实例化一个新的对象。
2.私有化引用 - 不能进行外部修改。
3.公有静态方法是唯一可以获得对象的方式。
单例的两种写法:饿汉式和懒汉式
(1)饿汉式 开发通常用这种方式
class Singleton {
//1,私有构造函数,其他类就不能访问构造方法了
private Singleton(){}
//2,创建本类对象,private使外部不能随意更改
private static final Singleton s = new Singleton();
//3,对外提供公共的访问方法
public static Singleton getInstance() {
return s;
}
}
(2)懒汉式 面试通常考这种方式
饿汉式 是不管你用不用,上来就创建对象
懒汉式 是事先做个判断 什么时候用什么时候创建
//懒汉式, 单例的延迟加载模式 面试
class Singleton {
//1,私有构造函数
private Singleton(){}
//2,声明一个本类的引用
private static final Singleton s;
//3,对外提供公共的访问方法
public static Singleton getInstance() {
if(s == null)
//线程1,线程2
s = new Singleton();
return s;
}
}
懒汉式在多线程使用时有安全隐患,有可能创建出多个对象出来。所以开发一般用饿汉式,面试一般是懒汉式。
饿汉式和懒汉式的区别
1,饿汉式是空间换时间,懒汉式是时间换空间
2,在多线程访问时,饿汉式不会创建多个对象,而懒汉式有可能会创建多个对象
来看一下使用情况:一个国家只能有一位总统(可能在正常情况下)。所以不管任何时候我们需要一位总统,使用AmericaPresident就能返回一个。getPresident()方法将确保只有一个总统对象被创建。否者,就不妙了。
类图
public class AmericaPresident {
private AmericaPresident() {}
private static final AmericaPresident thePresident=new AmericaPresident();
public static AmericaPresident getPresident(){
return thePresident;
}
}