本帖最后由 shenqi 于 2013-4-27 00:07 编辑
第二贴之单例设计模式(Singleton)
单例(Singleton)其实就是唯一实例的意思,也就是说一个类只有一个唯一的实例。在Java里,只要new一个类,就会创建这个类的一个实例,如果把这个类new多次,就会创建这个类的多次实例。有时候如果要程序运行时,不管new多少次,只需创建这个类的一个实例,这时候就用到单例。这就好比在足球场上,双方队员都在围绕着一个足球进行运动,时刻保持足球场上只有一个足球,试想一下如果足球场上有多个足球,球员岂不是乱套了不知该踢哪个球?
单例是一种设计模式,是23种设计模式之一,也是当中最简单最重要的一个设计模式了。单例分为饿汉式(饱汉式)和懒汉式(饥汉式)。
饿汉式(饱汉式):类加载时就创建好实例,等待别人调用。简单来说就是一开始就饿然后马上就吃饱了。张孝祥老师高新技术里称 饱汉式 和 饥汉式,这里区分一下就是。
示例代码:
- Class Singleton{
- //为了防止让别人创建多个实例,首先把修饰符的权限变成最小的
- private Singleton (){}
- //一上来就创建实例
- private static Singleton instance = new Singleton ();
- //给外界提供一个唯一的实例的返回值
- public static Singleton getInstance (){
- return instance;
- }
- }
复制代码 懒汉式(饥汉式):类加载时不创建,等待别人调用时再创建实例。简单来说就是一开始不吃,等到饿的时候再吃。
示例代码:
- Class Singleton{
- //同上
- private Singleton(){}
- //一开始定义好
- private Singleton instance = null;
- //调用时再创建实例返回
- public static Singleton getInstance(){
- if(instance == null)
- instance = new Singleton();
- return instance;
- }
- }
复制代码 注意:在多线程编程中 懒汉式 存在线程安全问题,会导致可能存在1个以上的实例,所以必须用双检测机制,把以上代码修改成:
Class Singleton{
privateSingleton(){}
privateSingleton instance = null;
//在此处添加synchronized
public static Singleton getInstance(){ if(instance == null){ synchronized (Singleton.class){ if(instance ==null){ instance =new Singleton(); } } } 除此之外还可以使用JDK5.0的新特性枚举(enumeration)来设计单例模式:
示例代码:- Class Singleton{
- private Singleton(){}
- private Singleton instance = null;
- //在此处添加synchronized
- public static Singleton getInstance(){
- if(instance == null){
- synchronized (Singleton.class){
- if(instance == null){
- instance = new Singleton();
- }
- }
- }
复制代码 关于枚举的知识,大家可以参考张孝祥老师的视频--高新技术①:
http://edu.csdn.net/news/2012823/6a28cc67ab0f.shtml
总结:
1. 在开发中通常使用的是饿汉式来设计单例模式,因为不存在线程安全问题。
2. 如果需要写多个单例,可以适当考虑使用enum枚举来设计,这样代码更加简洁。
3. 懒汉式 通常是面试官面试程序员用的,所以注意一下就可以。
|