您的位置:首页 > 编程语言 > Java开发

JAVA设计模式之单例模式

2016-05-16 20:03 393 查看
单例模式:整个应用中保证只有一个类的实例存在。比如打印缓冲池和文件系统等。

于是我们很容易想到可以把类的构造函数写成私有的,然后提供方法可以返回一个静态的实例。

写法一:

package designPattern;

public class SingletonClass
{
private static final SingletonClass instance = new SingletonClass();

public static SingletonClass getInstance()
{
return instance;
}

private SingletonClass()
{

}
}


评价:只要加载这个类,即使没有使用过,实例也会被创建。(这个缺点其实挺勉强的,既然创建了这个类为什么不使用呢?)

写法二:

package designPattern;

public class SingletonClass
{
private static SingletonClass instance = null;

public synchronized static SingletonClass getInstance()
{
if(instance == null)
{
instance = new SingletonClass();
}
return instance;
}

private SingletonClass()
{

}
}


评价:调用的时候再创建实例,但由于步骤的分离,为了线程安全需要加上同步化的关键字,同步化会让程序效率变低。

写法三:

package designPattern;

public class SingletonClass
{
private volatile static SingletonClass instance = null;

public static SingletonClass getInstance()
{
if(instance == null)
{
synchronized(SingletonClass.class)
{
if(instance == null)
{
instance = new SingletonClass();
}
}
}
return instance;
}

private SingletonClass()
{

}
}


评价:在写法二的基础上,只有instance == null的时候才加锁,所以提高了效率,但是感觉代码略显冗余。

写法四:

package designPattern;

public class SingletonClass
{
private static class SingletonClassInstance
{
private static final SingletonClass instance = new SingletonClass();
}

public static SingletonClass getInstance()
{
return SingletonClassInstance.instance;
}

private SingletonClass()
{

}
}


评价:在类的内部多实现了一个静态类,只在调用的时候才会创建实例,且不需要同步化,比较推荐使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: