• 单例模式


    第一种:饿汉式

    public class Singleton {
        //饿汉式
        //在自己内部定义自己一个实例
        private static Singleton instance = new Singleton();
        
        //如上面所述。将构造函数设置为私有
        private Singleton(){
            
        }
        
        //静态工厂方法,提供了一个供外部访问得到对象的静态方法
        public static Singleton getInstance(){
            return instance;
        }
    }

    第二种:懒汉式(注意:多线程的情况下要用synchronized,线程同步)

    public class Singleton {
        //懒汉式
        private static Singleton instance = null;
        
        //如上面所述。将构造函数设置为私有
        private Singleton(){
            
        }
        
        //静态工厂方法,提供了一个供外部访问得到对象的静态方法
        public static synchronized Singleton getInstance(){
            if(instance == null)
                instance = new Singleton();
            return instance;
        }
    }

    第三种:静态内部类

    public class Singleton {
        
        private static class SingletonHolder{
            private static final Singleton INSTANCE = new Singleton();
        } 
        
        //构造函数私有化
        private Singleton(){}
        
        public static final Singleton getInstance(){
            return SingletonHolder.INSTANCE;
        } 
    }

    第四种:枚举

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

    第五种:双重校验锁

    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;
        }
    }

     第六种:登记式实现

    import java.util.HashMap;
    //父类
    public class Singleton {
        //用来存放对应关系
        private static HashMap<String,Singleton> sinRegistry = new HashMap<String,Singleton>();
        static private Singleton singleton = new Singleton();
        
        //受保护的构造函数
        protected Singleton(){
            
        }
        
        public static Singleton getInstance(String name){
            if(name == null){
                name = "Singleton";
            }
            if(sinRegistry.get(name) == null){
                try {
                    sinRegistry.put(name, (Singleton)Class.forName(name).newInstance());
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
            return (Singleton)(sinRegistry.get(name));
        }
    }
    
    //子类
    public class SingletonChild extends Singleton{
        
        public SingletonChild(){}
        
        static public SingletonChild getInstance(){
            return (SingletonChild) Singleton.getInstance("SingletonChild");
        }
       
    }
  • 相关阅读:
    apscheduler 踩坑
    fastapi 导出excel文件
    python flask 使用日志
    git 头指针游离问题
    C# 连接mysql填坑
    前端项目proxy小问题
    需完善--日志框架
    依赖<dependency>的scope了解
    git 退回到指定tag版本
    git切换远程仓库地址
  • 原文地址:https://www.cnblogs.com/Venom/p/3282920.html
Copyright © 2020-2023  润新知