单例模式的实现与使用
2013-04-14 14:13
127 查看
单例模式,也叫单子模式,是一种常用的软件设计模式。在应用这个模式时,单例对象的类必须保证只有一个实例存在。许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。
通常单例模式在Java语言中,有两种构建方式:
饿汉方式。指全局的单例实例在类装载时构建。
懒汉方式。指全局的单例实例在第一次被使用时构建。
这两种实现方式在使用时有何不同呢?考虑两点:
在获取单例对象时,饿汉方式可以直接返回一个在类装载时即创建好的单实例对象,而懒汉方式则需要先判断是否已经存在单例对象,如果存在则直接返回已有对象,否则创建新的的对象返回。此时,需要特别注意的是:在多线程条件下,需要足够的手段保证实例没有被多次创建。
饿汉方式在类装载时即创建单例对象,这意味着程序无法在运行过程中根据特定的条件创建不同类型的对象,而懒汉模式配合工厂模式则可以实现以上要求。
以上第二点是在面试时被问到的一个问题的回答,面试官还提到在实际的工程中要想实现真正的单例其实是很困难的,因此我又搜索的一些资料,发现http://calmness.iteye.com/blog/60179 有完整的解答,稍后有空再整理归纳出来。
通常单例模式在Java语言中,有两种构建方式:
饿汉方式。指全局的单例实例在类装载时构建。
public class Singleton { private final static Singleton INSTANCE = new Singleton(); // Private constructor suppresses private Singleton() {} // default public constructor public static Singleton getInstance() { return INSTANCE; } }
懒汉方式。指全局的单例实例在第一次被使用时构建。
public class Singleton { private static volatile Singleton INSTANCE = null; // Private constructor suppresses // default public constructor private Singleton() {} //thread safe and performance promote public static Singleton getInstance() { if(INSTANCE == null){ synchronized(Singleton.class){ //when more than two threads run into the first null check same time, to avoid instanced more than one time, it needs to be checked again. if(INSTANCE == null){ INSTANCE = new Singleton(); } } } return INSTANCE; } }
这两种实现方式在使用时有何不同呢?考虑两点:
在获取单例对象时,饿汉方式可以直接返回一个在类装载时即创建好的单实例对象,而懒汉方式则需要先判断是否已经存在单例对象,如果存在则直接返回已有对象,否则创建新的的对象返回。此时,需要特别注意的是:在多线程条件下,需要足够的手段保证实例没有被多次创建。
饿汉方式在类装载时即创建单例对象,这意味着程序无法在运行过程中根据特定的条件创建不同类型的对象,而懒汉模式配合工厂模式则可以实现以上要求。
以上第二点是在面试时被问到的一个问题的回答,面试官还提到在实际的工程中要想实现真正的单例其实是很困难的,因此我又搜索的一些资料,发现http://calmness.iteye.com/blog/60179 有完整的解答,稍后有空再整理归纳出来。
相关文章推荐
- 使用包装设计模式,实现标准连接池
- Android WindowManager的使用 & 添加 遮罩层 实现夜间模式
- 使用一个Activity进行所有界面的显示,观察者模式实现标题与底部根据中间页面的改变而改变
- VirtualBox下使用NAT模式实现外部访问guest
- 使用工厂模式、策略模式实现BASE64,MD5,SHA,HMAC,DES各种加密算法
- 第5章分布式系统模式 使用服务器激活对象通过 .NET Remoting 实现 Broker
- 如何使用三层架构设计模式去完整的实现一个功能?
- 使用Object.wait与notify实现生产者与消费者模式
- 使用单例模式实现自己的HttpClient工具类
- VO(DTO)存在的必要性,以及使用工厂模式+模版模式+自省实现可拓展VO
- 如何使用 Java8 实现观察者模式?(上)
- PHP设计模式笔记:使用PHP实现适配器模式
- 设计模式-观察者模式,以及如何使用观察者来为app实现即时通讯功能
- C#中使用委托和事件实现观察者模式(observer pattern)
- ASP.NET MVC框架下使用MVVM模式 knockoutjs的实现原理
- Caffe使用openblas实现CPU模式使用多线程
- Java多线程——使用wait/notify实现生产者/消费者模式
- 使用策略模式(strategy pattern)实现多关键字排序(1)
- Android使用单例模式实现退出应用程序
- 在C#中使用装饰器模式和扩展方法实现Fluent Interface