`
airu
  • 浏览: 270767 次
  • 性别: Icon_minigender_1
  • 来自: 云南
社区版块
存档分类
最新评论

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

 
阅读更多
单例模式,应该是最简单但是也是用得很多的模式。
当然,这个模式的实现也是五花八门,如果要考虑多种场合,那么也是非常的精彩。
目前,很多这方面的文章写的也很好。我真的就不想班门弄斧了。
所以连接如下: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设计模式】你对单例模式了解多少,一文深入探究

    目录单例模式懒汉式单例模式未初始化问题解决Double Check 双重检查方案一:不让第二步和第三步重排序-DoubleCheck方案二:基于类初始化-静态内部类饿汉式饿汉式与懒汉式最大区别序列化破坏单例模式原理枚举单例基于...

    C#23种设计模式_示例源代码及PDF

    单例模式: 而且自行实例化并向整个系统提供这个实 单例模式 单例模式确保某一个类只有一个实例, 例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。 结构型模式 6、ADAPTER —在朋友聚会上碰到...

    AgilePrinciplesPatternsandPracticesinC#(C#设计模式 英文版)

    - 单例模式确保类只有一个实例,并提供一个全局访问点。 - 观察者模式允许对象在状态改变时通知其他对象,实现了对象间的松耦合。 - 装饰器模式动态地给一个对象添加额外的职责,提供了比继承更有弹性的扩展对象...

    设计模式例题

    3. **单例模式**:确保某些类在系统中只有一个实例,并提供一个全局访问点。例如,可以为财务系统、库存系统等设计单例类,保证在整个应用程序中只使用一个实例。 此外,对于案例中提到的订单打印程序,可以使用...

    java-每天一练2

    8. **设计模式**:单例、工厂、观察者等常见设计模式的实现和应用。 9. **JVM内存模型**:堆、栈、方法区的理解,垃圾回收机制。 10. **工具的使用**:如IDEA、Eclipse等集成开发环境的配置和调试技巧,Maven或...

    敏捷软件开发:原则、模式与实践.pdf

    - **单例模式(Singleton Pattern)**:确保一个类只有一个实例,并提供一个全局访问点。这在管理共享资源时非常有用。 - **工厂模式(Factory Pattern)**:定义一个创建对象的接口,让子类决定实例化哪一个类。...

    OC编程之道.pdf.zip

    每天都有更多的iOS开发者想投入到这一潮流,希望凭藉下一个杀手级应用发家致富。本书的目标正是带领读者完成从新手到高手的转变,关注底层的设计模式而非一味只顾着写代码,从而开发出更加高效、实用和专业的应用。...

    Java面试总结~~~~.docx

    - 常见的设计模式如工厂模式、单例模式、观察者模式等,面试时可能需要你详细解释某个模式的实现。 - 设计模式在实际项目中的应用和扩展。 5. **数据库相关**: - SQL语句的编写和优化,如group by、join操作。 ...

    敏捷软件开发-原则、模式与实践

    4. **设计模式**:书中介绍了一系列经典的软件设计模式,如工厂模式、单例模式、观察者模式等,这些模式提供了解决常见问题的结构化解决方案,帮助开发者写出易于理解和维护的代码。 5. **TDD(测试驱动开发)**:...

    这是一个设计轻盈优雅的企业级C++服务器引擎

    - **设计模式**:采用如工厂模式、单例模式、观察者模式等设计模式,优化代码结构,提高可读性和可维护性。 - **性能优化**:通过精巧的数据结构和算法,减少不必要的拷贝和内存分配,优化CPU和内存使用。 3. **...

    java每天60分钟

    本书中介绍了一些常见的设计模式,如单例模式、工厂模式等,帮助读者更好地理解和应用面向对象编程思想。 **3.3 Java中的接口与抽象类** - **接口:** 定义了一组行为规范,任何实现了该接口的类必须实现接口中...

    04-08软件设计师汇总.rar

    设计模式是解决常见问题的成熟方案,如工厂模式、单例模式等。UML作为可视化建模工具,有助于提高设计的沟通和理解。 2008年的试题则涵盖了软件工程的最新趋势和技术,比如敏捷开发、服务导向架构(SOA)和Web服务...

    项目开发详细设计说明书(超好用)-完整版.doc

    设计模式是软件工程中经过实践证明的有效解决方案模板,如工厂模式、观察者模式或单例模式等,它们可以提高代码的可读性、可维护性和复用性。这一章详细解释了这些模式如何在系统设计中被选用和实现,以及它们对系统...

    考试类精品--「JavaGuideInterview学习」每日 3+1,以面试题来驱动学习,提倡每日学习与思考,每天.zip

    11. **设计模式**:学习常见的设计模式,如工厂模式、单例模式、建造者模式、装饰器模式、适配器模式、观察者模式等,以及在实际项目中的应用。 12. **Java 8及更高版本的新特性**:比如Lambda表达式、Stream API、...

    Pro.JavaScript.Design.Patterns.RETAiL.Dec.2007

    4. 设计模式的实现:书中将会涉及工厂模式(factory)、单例模式(singleton)、观察者模式(observer)、组合模式(composite)和外观模式(facade)等常用的设计模式,并展示如何在JavaScript中轻松理解并实现这些...

    数据课程设计排班系统.rar

    - **单例模式**:用于确保排班系统的实例只有一个,避免数据冲突。 - **工厂模式**:创建保安对象,根据需求动态生成不同类型的保安实例。 5. **异常处理**: - 确保在处理数据或进行计算时捕获可能出现的错误,...

    使用Quartz.net定时备份SQL Server.pdf

    单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在***定时备份SQL Server的软件中,采用单例模式可以防止程序启动多个备份进程,从而避免资源浪费和潜在冲突。 5. XML配置...

    用友软件面试题

    单例模式是一种设计模式,确保某个类在应用程序中只有一个实例。使用单例模式可以节省内存,因为它限制了实例的个数。 7. 外键: 外键是关系数据库中的一种约束,用于确保数据的一致性。外键指定了一个表中的某个...

    Go语言代码样例

    单例模式确保一个类只有一个实例,并提供全局访问点。Go语言中,我们可以采用闭包和sync.Once来实现。一种方法是在包级别定义一个变量和一个初始化函数,初始化函数内部使用`sync.Once`确保只执行一次,创建并返回...

Global site tag (gtag.js) - Google Analytics