写法一(饿汉式):
public class Test{
private/public static Test test = new Test();
private Test(){ }
public static Test getInstance(){
return test;
}
}
写法二(懒汉式,延迟加载方式)
public class Test{
private/public static Test test = null;
private Test(){ }
public static Test getInstance(){
if(test == null){
test = new Test();
}
return test;
}
}
对于饿汉式,当类被加载的时候,已经创建好了一个静态对象,因此,是线程安全的,但缺点是在这个对象还没被使用的时候就已经被创建出来了。
对于懒汉式,缺点是非线程安全的。例如当第一个线程执行到判断语句if(test == null)时,第二个线程执行判断语句if(test == null),接着第一个线程执行语句test = new Test(),第二个线程也执行test = new Test(),在这种多线程环境下,可能会创建出两个对象。当然这种写法的优点是按需创建对象,只有对象被使用的时候才会被创建。
单例模式的目的:保证一个类的对象的唯一性
单例模式的应用场景:例如多个程序都要使用一个配置文件中的数据,而且要实现数据的共享和交换。必须要将多个数据封装到一个对象中,而且多个程序操作的是同一个对象。也就是说要保证这个配置文件对象的唯一性。
1、如何保证对象的唯一性?
一个类只要提供构造函数,就可以产生多个对象,数量不可控。那么如何才能实现单例模式的功能呢?
解决方法:不让其他程序建立对象,自己在本类中创建对象(数量可控),对外提供访问方式。
1、直接private化构造函数
2、直接在本类中new一个对象。即可采用private方式,也可采用public方式。当采用public时,可以通过 Test test = Test.test来获取对象,也可以通过getInstance方法来获取对象。若是采用private,则只能通过getInstance方法来获取对象。
3、给其他程序提供访问方式(getInstance方法)