单例模式

第一种:饿汉式

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");
    }
   
}
原文地址:https://www.cnblogs.com/Venom/p/3282920.html