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

     单例模式

    定义:

    确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例

    使用场景:

    实现单例模式几个关键点

    例子:

    public class Staff {
        public void work() {
            
        }
    }
    public class VP extends Staff{
        public void work() {
            
        }
    }
    public class CEO extends Staff{
        
        private static final CEO M_CEO = new CEO();
        
        private CEO() {
            
        }
        
        public void work() {
            
        }
        
        
        public static CEO getCEO() {
            return M_CEO;
        }
        
    }
    public class Company {
        
        private List<Staff> list = new ArrayList<>();
        
        public void addStaff(Staff per) {
            list.add(per);
        }
        
        public void showStaff() {
            for(Staff staff : list) {
                System.out.println(staff.toString());
            }
        }
        
        
        public static void main(String [] args) {
            Company company = new Company();
            
            Staff ceo1 = CEO.getCEO();
            Staff ceo2 = CEO.getCEO();
            
            company.addStaff(ceo1);
            company.addStaff(ceo2);
            
            
            Staff vp1 = new VP();
            Staff vp2 = new VP();
            
            
            Staff staff1 = new Staff();
            Staff staff2 = new Staff();
            Staff staff3 = new Staff();
            
            company.addStaff(vp1);
            company.addStaff(vp2);
            company.addStaff(staff1);
            company.addStaff(staff2);
            company.addStaff(staff3);    
            company.showStaff();
            
        
        }
    }

     上面的例子就是饿汉模式,以下简单例子:

    class Singleton{
        private static Singleton instance = new Singleton();
        
        private Singleton() {   
        }
    
        public static Singleton getInstance() {
            return instance;
        }
    }

    单例模式的其他实现方法

    1、懒汉模式,线程安全

    class Singleton{
        private static Singleton instance;
        
        private Singleton() {   
        }
    
        public static synchronized Singleton getInstance() {
            if(instance == null) {
                instance = new Singleton();
            }
            return instance;
        }
    }

    2、懒汉模式,线程不安全

    上面的那个例子把 getInstance()方法的关键字synchronized去掉就是了

    3、双重校验锁double check lock DCL

    public class Singleton {  
        private volatile static Singleton singleton;  
        private Singleton (){}  
        public static Singleton getSingleton() {  
        if (singleton == null) {  
            synchronized (Singleton.class) {  
            if (singleton == null) {  
                singleton = new Singleton();  
            }  
            }  
        }  
        return singleton;  
        }  
    }

    4、静态内部类单例模式

    class Singleton{
        private Singleton() {
        }
        
        public static Singleton getInstance() {
            return SingletonHolder.SINGLETON;
        }
        
        private static class SingletonHolder{
            private static final Singleton SINGLETON = new Singleton();
        }
    }

    5、枚举单例模式

    public enum Singleton {  
        INSTANCE;  
        public void whateverMethod() {  
        }  
    }

    6、使用容器实现单例模式

    class Singleton{
        private static Map<String, Object> objMap = new HashMap<>();
        
        private Singleton() {
            
        }
        
        public static void registerService(String key,Object object) {
            if(!objMap.containsKey(key)) {
                objMap.put(key, object);
            }
        }
        
        public static Object getService(String key) {
            return objMap.get(key);
        }
    }
  • 相关阅读:
    element-ui-——el-uploadexcel导入
    正则表达式
    vue调用兄弟组件的方法使用vueBus调用$emit、$on(只需触发方法即可,不需要考虑传值或参数的问题)
    vue用法父组件调用子组件方法--->$refs
    vue——父子传值
    响应式布局
    vue创建脚手架 cil
    Vue 循环为选中的li列表添加效果
    课后习题-14
    date 命令详解
  • 原文地址:https://www.cnblogs.com/zquan/p/9445944.html
Copyright © 2011-2022 走看看