单例模式,应该是最简单但是也是用得很多的模式。
当然,这个模式的实现也是五花八门,如果要考虑多种场合,那么也是非常的精彩。
目前,很多这方面的文章写的也很好。我真的就不想班门弄斧了。
所以连接如下:
http://www.iteye.com/topic/60179
这里通过对多线程,类加载器,反射,序列化等各种情况下的单例做了讨论。
实际的运用可能有那么复杂,但是我们还是尽量保证单列,不要去刻意破坏。
还有,上面的文章中,少了一种内部类实现,也是一种很好的方式。
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方法,可以防止再创建新的类。
单例模式确实很多的问题还可以思考的,如果考虑到不同的虚拟机呢?
当然不同的环境下,我们的实现方法也是多样的,也许还能想出更多花样。
分享到:
相关推荐
java设计模式中的单例模式,而单例模式又分为饿汉模式和懒汉模式
李建忠老师的设计模式-单例模式讲解,示例以C++编程语言呈现。
设计模式--单例模式java例子
设计模式-单例模式 学习时候联系的代码,可以进行参考
设计模式-单例模式脑图
JAVA-设计模式-创建型模式-单例模式
设计模式专题之(一)单例模式---设计模式单例模式模式示例代码(python--c++)
ava常用设计模式-单例模式
设计模式-单例模式(讲解及其实现代码)
Java设计模式-单例模式详解
常见设计模式-单例模式
c++设计模式-创建型模式-单例模式源码,懒汉式 饿汉式源码,qt工程,单例模式线程安全问题,单例模式实现方式
Java-设计模式-单例模式-实现源码(简单实现、双重检查锁、静态内部类、枚举类)
单例模式--只能弹出一个窗体 只能弹出一个窗体
android 单例模式 干货 告诉你哪种单例模式最实用 最好用 不再迷茫
本文档,详细的描述了单例模式,有类图,java代码实例,以及讲解、注意点,通过这份文档可以让你很容易理解单例设计模式。
设计模式 For iOS-02-单例模式 严 格 严谨 详细的单例模式。
最简单的PHP设计模式,单例模式。大家可以参考下。
单例模式属于构建模式之一, 优点:实例控制--伸缩性 缺点:系统开销---开发混淆---对象生命周期