【设计模式】单例模式

确保一个类只有一个实例,并提供一个全局访问点。
那么怎样保证一个类只有一个实例呢? 就要保证这个类不能被实例化,否则随便在类的外面new对象就不能保证唯一性了。因此单例模式第一件要做的事情就是 私有化构造方法

public class Singleton {
	private Singleton() {

	}
}

构造方法私有化之后,就要提供一个只能存在一个的实例,返回这个单例对象

public class Singleton {
	private static Singleton singleton;

	private Singleton() {

	}

	public Singleton getInstance() {
		if (singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}

这样乍一看好像已经达到了一个单例的效果。但是还是需要考虑一点:并发,如果多个客户并发来访问这段代码,在 判断 if (singleton == null) 时,如果两个客户并发进来则会导致这两个客户得到的不同的实例,就没有达到单例的效果,因此单例代码还是需要修改。
下面分为三个修改模式:

  • 直接用同步锁锁上(效率有点弱,只有在第一次singleton的null的时候这个同步锁才有用,以后的都是无意义的锁)
  • 饿汉模式
  • 懒汉模式
//直接加锁,效率下降很多
public class Singleton {
	private static Singleton singleton;

	private Singleton() {

	}

	public synchronized Singleton getInstance() {
		if (singleton == null) {
			singleton = new Singleton();
		}
		return singleton;
	}
}
//饿汉模式
public class Singleton {
	private static Singleton singleton = new Singleton();

	private Singleton() {
	}
	public  Singleton getInstance() {
		return singleton;
	}
}

//懒汉模式
public class Singleton {
	private volatile static  Singleton singleton;

	private Singleton() {
	}
	public  Singleton getInstance() {
		if(singleton == null){
			synchronized (Singleton.class) {
				if(singleton == null)
					singleton = new Singleton();
			}
		}
		return singleton;
	}
}

这个饿汉模式和懒汉模式的区别,从字面意义上也很好理解,一个是很急切的在类一加载的时候直接就初始化, 另一个懒汉模式,则是在需要用的时候再初始化。

posted @ 2017-03-16 11:06  江湖小_虾  阅读(116)  评论(0)    收藏  举报