zoukankan      html  css  js  c++  java
  • 单例设计模式

    方法一:饿汉式

    /**
     * 单例模式---->饿汉式
     * @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() {  
        }  
    }
  • 相关阅读:
    遍历指定目录及其子目录下所有文件
    vim 配置
    解决 Mendeley Linux 中文输入问题
    全角半角字符对照表
    chrome 替换多线程下载管理器
    查看系统日志
    中大东校区iNode For linux 配置笔记
    anaconda 虚拟环境笔记
    linux 网络操作
    deepin 装机
  • 原文地址:https://www.cnblogs.com/Actexpler-S/p/7659845.html
Copyright © 2011-2022 走看看