单例设计模式

方法一:饿汉式

/**
 * 单例模式---->饿汉式
 * @author wzc
 */
public class Singleton {
    private  Singleton(){}                                  //1.构造器私有化---->private----->防止外部创建对象
    private  static  Singleton instance=new Singleton();    //2.在本来中创建一个对象实例--->private
    //3.提供一个外部能够获取这个唯一对象的接口----->public 
    public static Singleton getInstance(){                  //static--->外部不能创建对象,只能通过类的方式调用静态方法
        return instance;                                    //返回给外部这个唯一对象
    }
}

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,都会占据一定的内存,但是相应的,在第一次调用时速度也会更快,因为其资源已经初始化完成。饿汉式天生就是线程安全的,可以直接用于多线程而不会出现问题

 

方法二:静态方法类

/**
 * 单例模式---->静态内部类
 * @author wzc
 */
public class Singleton2 {
    private Singleton2(){}//1.构造器私有化
    private static  class SingletonHolder{//静态内部类
        private static final Singleton2 instance=new Singleton2();     //实例化对象
    }
    public static final Singleton2 getInstance(){  //只有调用getInstance才会实例化instance
        return SingletonHolder.instance;           //返回唯一对象
    }
}

第一次加载Singleton类时并不会初始化sInstance,只有第一次调用getInstance方法时虚拟机加载SingletonHolder 并初始化sInstance ,这样不仅能确保线程安全也能保证Singleton类的唯一性,所以推荐使用静态内部类单例模式。

方法三:懒汉式

/**
 * 单例模式-----懒汉式
 * 线程安全
 * @author WZC
 */
public class Singleton3 {
    private  Singleton3(){}   //私有化构造器
    private  static Singleton3 instance;    //声明单例对象
    //外部公有获取单例对象的接口    
    public static synchronized Singleton3 getInstance(){
        if (instance==null) {              //判断单例对象是否已经被初始化
            instance=new Singleton3();     //未被初始化则进行初始化,否则不再重复初始化
        }
        
           return instance;                 //返回单例对象
    }
}

延迟加载,即当需要用到此单一实例的时候,才去初始化此单一实例。

 

方法四:双重检查锁定

/**
 * 单例模式----双重锁
 * 线程安全+高效
 * @author wzc
 */
public class Singleton4 {
    private Singleton4(){}     //私有化构造器
    private static Singleton4 instance; //声明单例对象
    //给外界提供公有获取单例对象的接口
    public static Singleton4 getInstance(){
        if (instance==null) {      // 判断是否已经被实例化
            synchronized (Singleton4.class) {  //为线程提供锁  
                if (instance==null) {          //由线程等待-->运行态时,线程可能已经被实例化了,所以在判断一次是否被实例化
                    instance=new Singleton4();      //初始化单例对象
                }
            }
        }
        return  instance;        //返回单例对象
    }
}

上一份效率有点低,这种方法提高了效率

 

方法五:枚举类型

/**
 * 单例模式----枚举类型
 * @author wzc
 *
 */
public enum Singleton5 {
     INSTANCE;  
    public void doSomeThing() {  
    }  
}
posted @ 2017-10-13 10:27  Actexpler  阅读(129)  评论(0编辑  收藏  举报