日拱一卒(三十八)

单例模式(Singleton):保证一个类仅有一个实例,并提供一个访问它的全局访问点。

  •  白话:略

  • 实现:(1)私有化构造方法

                    (2)提供一个静态方法返回这个单例的应用。

  •  使用场景:某个情况下只允许这个类的一个实例存在,比如某个界面只允许弹出一个对话框,则对话框可以设置为单例。
  •  实现方式:

 1.饿汉式---------------------饿到看到声明引用时马上构造

class Singleton {
	private static Singleton instance = new Singleton();

	private Singleton() {
	};

	public static Singleton getInstance() {
		return instance;
	}
}

2.懒汉式----------------------懒到第一次调用时构造 

class Singleton {
	private static Singleton instance = null;

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

	private Singleton() {
	}
}

      2.1懒汉变种:静态内部类加载:                               

class Singleton {  
    private static class SingletonHolder {  
    private static final Singleton INSTANCE = new Singleton();  
    }  
    private Singleton (){}  
    public static final Singleton getInstance() {  
    return SingletonHolder.INSTANCE;  
    }  
}  

3.另类实现:

enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
} 

==============================================华丽分割线==============================================

下面是单例模式的两个问题,转之:http://cantellow.iteye.com/blog/838473

有两个问题需要注意:

1.如果单例由不同的类装载器装入,那便有可能存在多个单例类的实例。假定不是远端存取,例如一些servlet容器对每个servlet使用完全不同的类装载器,这样的话如果有两个servlet访问一个单例类,它们就都会有各自的实例。

2.如果Singleton实现了java.io.Serializable接口,那么这个类的实例就可能被序列化和复原。不管怎样,如果你序列化一个单例类的对象,接下来复原多个那个对象,那你就会有多个单例类的实例。

  1. private static Class getClass(String classname)      
  2.                                          throws ClassNotFoundException {     
  3.       ClassLoader classLoader = Thread.currentThread().getContextClassLoader();     
  4.       
  5.       if(classLoader == null)     
  6.          classLoader = Singleton.class.getClassLoader();     
  7.       
  8.       return (classLoader.loadClass(classname));     
  9.    }     
  10. }  

对第二个问题修复的办法是:

  1. public class Singleton implements java.io.Serializable {     
  2.    public static Singleton INSTANCE = new Singleton();     
  3.       
  4.    protected Singleton() {     
  5.         
  6.    }     
  7.    private Object readResolve() {     
  8.             return INSTANCE;     
  9.       }    
  10. }  



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值