java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。
单例模式有一下特点:
1、单例类只能有一个实例。
2、单例类必须自己自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
//饿汉式单例类.在类初始化时,已经自行实例化 public class Singleton1 { //私有的默认构造子 private Singleton1() {} //static 修饰 类初始化时创建唯一实例 private static final Singleton1 single = new Singleton1(); //静态工厂方法 public static Singleton1 getInstance() { return single; } }
//懒汉式单例类.在第一次调用的时候实例化 public class Singleton2 { //私有的默认构造子 private Singleton2() {} //注意,这里没有final private static Singleton2 single=null; //静态工厂方法 public synchronized static Singleton2 getInstance() { if (single == null) { single = new Singleton2(); } return single; } }
import java.util.HashMap; import java.util.Map; //登记式单例类是GoF 为了克服饿汉式单例类及懒汉式单例类均不可继承的缺点而设计的 //类似Spring里面的方法,将类名注册,下次从里面直接获取。 public class RegSingleton { private static Map<String, RegSingleton> map = new HashMap<String, RegSingleton>(); static { RegSingleton single = new RegSingleton(); map.put(single.getClass().getName(), single); } //默认构造 保护 protected RegSingleton() { } //静态工厂方法,返还此类惟一的实例 public static RegSingleton getInstance(String name) { if (name == null) { name = RegSingleton.class.getName(); } if (map.get(name) == null) { try { map.put(name, (RegSingleton) Class.forName(name).newInstance()); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } return map.get(name); } public String about() { return "Hello, I am RegSingleton."; } public static void main(String[] args) { RegSingleton single = RegSingleton.getInstance(null); System.out.println(single.about()); System.out.println(RegSingletonChild.getInstance().about()); } }
public class RegSingletonChild extends RegSingleton { public RegSingletonChild() { } /** * 静态工厂方法 */ static public RegSingletonChild getInstance() { return (RegSingletonChild)RegSingleton.getInstance(RegSingletonChild.class.getName()); } public String about() { return "Hello, I am RegSingletonChild."; } }