用来创建独一无二的,只能有一个实例的对象的入场券。
单例模式的类都有一个共性,那就是这个类没有自己的状态,换句话说,这些类无论你实例化多少个,其实都是一样的,而且更重要的一点是,这个类如果有两个或者两个以上的实例的话,程序会产生程序错误或者与现实相违背的逻辑错误。
例如 线程池,缓存, 对话框,注册表,数据库连接等等
没有公开的构造器,构造器声明为私有的
最标准最原始的单例模式构造
public class Singleton {
//一个静态的实例
private static Singleton singleton;
//私有化构造函数
private Singleton(){
}
//给出一个公共的静态方法返回一个单一实例
public static Singleton getInstance(){
if(singleton == null){
singleton = new Singleton();
}
return singleton;
}
}
1.静态实例,带有static关键字的属性在每一个类中都是唯一的。
2.限制客户端随意创造实例,即私有化构造方法,此为保证单例的最重要的一步。
3.给一个公共的获取实例的静态方法,注意,是静态的方法,因为这个方法是在我们未获取到实例的时候就要提供给客户端调用的,所以如果是非静态的话,那就变成一个矛盾体了,因为非静态的方法必须要拥有实例才可以调用。
4.判断只有持有的静态实例为null时才调用构造方法创造一个实例,否则就直接返回。
假如你去面试一家公司,给了你一道题,让你写出一个单例模式的例子,那么如果你是刚出大学校门的学生,你能写出上面这种示例,假设我是面试官的话,满分100的话,我会给90分,剩下的那10分算是给更优秀的人一个更高的台阶。但如果你是一个有过两三年工作经验的人,如果你写出上面的示例,我估计我最多给你30分,甚至心情要是万一不好的话可能会一分不给
至于为什么在并发情况下上述的例子是不安全的呢,我在这里给各位制造了一个并发的例子,用来说明,上述情况的单例模式,是有可能造出来多个实例的,我自己测试了约莫100次左右,最多的一次,竟然造出了3个实例。下面给出代码,大约运行10次(并发是具有概率性的,10次只是保守估计,也可能一次,也可能100次)就会发现我们创造了不只一个实例。