java中单例模式是一种常见的设计模式,
单例模式
分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
优点:
实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例
灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
案例:
private static Single mSinger = null;
private Single(){};
/** 懒汉式单例(线程不安全) */
public static Single getInstances(){
if (mSinger == null){
mSinger = new Single();
}
return mSinger;
}
/** 懒汉式单例(线程安全) */
public static synchronized Single getInstancesUp(){
if (mSinger == null){
mSinger = new Single();
}
return mSinger;
}
/** 双重检查锁定 */
public static Single getInstancesUp1(){
if (mSinger == null){
synchronized(Single.class){
if(mSinger == null){//二次检查
mSinger = new Single();
}
}
}
return mSinger;
}
private static final Single single = new Single();
//静态内部类,解决反复判断问题,既实现了线程安全,又避免了同步带来的性能影响
private static class ClazzHolder{
private static final Single INSTANCE = new Single();
}
public static Single getInstancesUp2() {
return ClazzHolder.INSTANCE;
}
//饿汉式,解决反复判断问题
//类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以天生就是线程安全的
public static Single getInstancesUp3(){
return single;
}
缺点:
开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题,上面的五种实现方式中已经说过了。
可能的开发混淆:使用 singleton 对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用 new 关键字实例化对象。因为可能无法访问库 源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
对象的生存期:Singleton 不能解决删除单个对象的问题。在提供 内存管理的语言中(例如基于 .NET Framework 的语言),只有 Singleton 类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除
对象实例,但这样会导致 Singleton 类中出现悬浮引用