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

    第一种:饿汉式

    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");
        }
       
    }
  • 相关阅读:
    09-23
    21-9-18日记1
    paho mqtt库使用记录
    UIS8811 的 NB-IOT 初认识(21-9-10工作记录 )
    go语言之异常捕获
    【原创】数据库基础之PostgreSQL
    【原创】Linux基础之fail2ban
    【原创】大叔经验分享(132)mac os 12启动idea失败
    【原创】大数据基础之Hadoop(3)hdfs diskbalancer
    【转】常用 Git 命令清单
  • 原文地址:https://www.cnblogs.com/Venom/p/3282920.html
Copyright © 2011-2022 走看看