一些关于单例模式的备注;

单例模式,是设计模式中常被问到的,【也是比较简单的】


目前,需要掌握的有三中形式吧,【枚举】,【懒汉】,和【饿汉】;

1,枚举,这一点要首先说,也是《effective java》推荐的,也是最简单的。

/**
* 我们可以通过EasySingleton.INSTANCE来访问实例,这比调用getInstance()方法简单多了。
* 创建枚举默认就是线程安全的,所以不需要担心double checked locking,
* 而且还能防止反序列化导致重新创建新的对象
* @author goujy
*
*/
enum SingletonDemo4{
instance;

/**
*这个方法可以删除,就是这里可以写其他方法。。
*
*/

public void otherMathdo(){

}
}

就这样,就没了。。。。简单来说,就一句话,#编写一个单元素的 枚举类#,里面再写 其他的方法,就随意了。

2,再讲懒汉,(之前一直分不清楚,一种方式是懒汉还是饿汉,:(  ),懒,我理解为 开始(默认)懒得new 出新对象,在使用的时候,才new 出新对象。

懒汉不加锁,涉及到多线程安全,线程加锁二次check,[个人认为这个其实也够用了]。

/**
 * 懒汉不加锁
 * @author goujy
 *
 */
class SingletonDemo1 {

    private static SingletonDemo1 sd1 = null;

    private SingletonDemo1() {

    }
    
    public static SingletonDemo1 getInstance() {
        if (sd1 == null) {                    
            sd1 = new SingletonDemo1();    
        }
        return sd1;
    }

}


/**
 * 懒汉加锁2
 * @author goujy
 *
 */
class SingletonDemo2 {

    private static SingletonDemo2 sd2 = null;

    private SingletonDemo2() {

    }
    
    public static SingletonDemo2 getInstance() {
        if (sd2 == null) {                        //Single Checked
            synchronized (SingletonDemo2.class) {
                if (sd2 != null) {                //Double Checked
                    sd2 = new SingletonDemo2();
                }
            }
        }
        return sd2;
    }

}
/**
 * 懒汉加锁3
 * @author goujy
 *
 */
class SingletonDemo3{
    private volatile  static  SingletonDemo3 sd3 =null;
    
    private SingletonDemo3(){
        
    }
    
    public static SingletonDemo3 getInstance(){
        if(sd3==null){
            synchronized (SingletonDemo3.class) {
                if(sd3==null){
                    sd3= new SingletonDemo3();
                }
            }
        }
        return sd3;
    }
}

3,再讲 饿汉模式,饿汉(饿的直接创建,不懒的创建了),其实饿汉也分两种,一种是直接用方法getInstance(),一种直接以 public final 静态属性。

/**
 * 单例模式
 * 饿汉隐藏属性,提供方法;
 * @author goujy
 * 
 */
public class SingletonDemo {

    private SingletonDemo() {

    }

    private final static SingletonDemo sd = new SingletonDemo();

    public static SingletonDemo getInstance() {
        return sd;
    }
}

/**
 * 饿汉直接以属性的形式;
 * @author goujy
 *
 */
class SingletonDemo0 {

    private SingletonDemo0() {

    }

    public final  static SingletonDemo0 sd = new SingletonDemo0();

}

主要的,基本就这几类。

 

posted @ 2016-05-09 14:10  junyi5257  阅读(301)  评论(0编辑  收藏  举报
北岸小站