每天一个(设计模式)-- 单例模式

单例模式,应该是最简单但是也是用得很多的模式。
当然,这个模式的实现也是五花八门,如果要考虑多种场合,那么也是非常的精彩。
目前,很多这方面的文章写的也很好。我真的就不想班门弄斧了。
所以连接如下:[url]http://www.iteye.com/topic/60179[/url]
这里通过对多线程,类加载器,反射,序列化等各种情况下的单例做了讨论。

实际的运用可能有那么复杂,但是我们还是尽量保证单列,不要去刻意破坏。

还有,上面的文章中,少了一种内部类实现,也是一种很好的方式。


public class SingletonInnerClass {

private SingletonInnerClass(){}

private static class InstanceHolder{
private static SingletonInnerClass _instance = new SingletonInnerClass();
}
public SingletonInnerClass getInstance(){
return InstanceHolder._instance;
}
}


然后说说反射,其实如果运用反射技术,那么就算是private的构造函数,也不能幸免。
上面连接的文章中,使用了Register的方式,配合工厂模式与反射,这也是一种约定的单例设计吧。

还有,如果是不同的类加载器,那么,还是可能存在多个实例。
我们可以统一使用当前线程绑定的类加载器。如果没有,默认就是应用程序的类加载器。


private static Class getClass(string classname)
throws ClassNotFoundException{
Classloader classLoader = Thread.currentThread().getContextClassLoader();
if(classLoader == null)
classLoader = Singleton.class.getClassLoader();
return (classLoader.loadClass(classname));
}

可以通过使用 java.lang.Thread 下的setContextClassLoader(Classloader)绑定一个我们自定义的Classloader。

最后,就是序列化,通过反序列化,也可以产生新的实例,不过这个是可以解决的。

public class SingletonSerio implements java.io.Serializable{
public static SingletonSerio instance = new SingletonSerio();
private SingletonSerio(){}
private Object readResolve(){
return instance;
}
}

通过重写readResolve方法,可以防止再创建新的类。


单例模式确实很多的问题还可以思考的,如果考虑到不同的虚拟机呢?
当然不同的环境下,我们的实现方法也是多样的,也许还能想出更多花样。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值