单例设计模式解决的问题:就是可以保证一个类在内存中的对象唯一性。
必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
如何保证对象唯一性呢?
1,不允许其他程序用new创建该类对象。
2,在该类创建一个本类实例。
3,对外提供一个方法让其他程序可以获取该对象。
如何保证对象唯一性呢?
1,不允许其他程序用new创建该类对象。
2,在该类创建一个本类实例。
3,对外提供一个方法让其他程序可以获取该对象。
基于以上,单例模式有以下特点:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
实现单例模式的一般步骤:
1、私有化该类构造函数。
2、通过new在本类中创建一个本类对象。
3、定义一个公有的方法,返回创建的对象。
一、饿汉式单例
class Single //类一加载,对象就已经存在了。
{
private static Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
}
饿汉式在加载类的同时就已经创建好一个静态的对象供系统使用,以后不再改变。
二、懒汉式单例
class Single2 //类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。
//延迟加载形式。
{
private static Single2 s = null;
private Single2(){}
public static Single2 getInstance()
{
if(s==null)
s = new Single2();
return s;
}
}
但是以上懒汉式单例的实现没有考虑线程安全问题,当同步调用getInstance()方法时,并发环境下很可能出现多个Singleton实例,要实现线程安全,要对getInstance这个方法改造。有以下三种方式:
1.在getInstance上加同步
public static synchronized Single2 getInstance()
{
if(s==null)
s = new Single2();
return s;
}
2.if语句嵌套检查
public static Single2 getInstance()
{
if(s==null{
synchronized(Single2.class){
if(s==null){
s = new Single2();
}
}
}
return s;
}
3.静态内部类public class Single2 {
private static class LazyHolder {
private static final Single2 INSTANCE = new Single2();
}
private Single2 (){}
public static final Single2 getInstance() {
return LazyHolder.INSTANCE;
}
}
public class Single2 {
private static class LazyHolder {
private static final Single2 INSTANCE = new Single2();
}
private Single2 (){}
public static final Single2 getInstance() {
return LazyHolder.INSTANCE;
}
}