转载请注明出处!!!http://blog.csdn.net/zhonghuan1992
所有配套代码均在github上:https://github.com/ZHONGHuanGit/DesignPattern
跟着ZHONGHuan学习设计模式
单例模式
作为对象的创建模式,单例模式确保一个类只有一个实例,而且自行实例化,并且向整个系通过提供这个实例。该类称为单例类。
为什么只要一个实例:
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一个系统只能有一个窗口管理器或文件系统;一个系统只能有一个计时工具或ID(序号)生成器。如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。
类图:
从类图中,getInstance()方法返回instance实例。
声明单例的方式:
饿汉式单例:
public class Singleton
{
private static Singleton singleton = new Singleton();//类加载了便初始化该单例对象
//之所以称之为饿汉式,因为他太急了
private Singleton()
{
}
public static Singleton getInstance()
{
return singleton;
}
}
懒汉式单例:
写法1:
public class Singleton
{
private static Singleton singleton;
private Singleton()
{
}
//注意这里synchronized,保证了线程安全,意思就是每次只有一个线程能够访问该方法
public static synchronized Singleton getInstance()
{
if(singleton == null)
{//当singleton要用的时候才初始化,加判断避免重复初始化,保证只new了一次
singleton= new Singleton();
}
return singleton;
}
}
写法2:(比较写法1,效率更高点)叫做double check
public class Singleton
{
private static Singleton instance = null;
private Singleton()
{
//dosomething
}
public static Singleton getInstance()
{
if(instance == null)
{
synchronized(Singleton.class)//可以思考一下,为什么这样提高效率
{
if(null == instance)
{
instance= new Singleton();
}
}
}
return instance;
}
}
Double check 的写法:
1 第一个条件是说,如果实例创建了,那就不需要同步了,直接返回就好了。
2 不然,我们就开始同步线程。
3 第二个条件是说,如果被同步的线程中,有一个线程创建了对象,那么别的线程就不用再创建了。