第一种:饿汉式
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"); } }