设计模式——单例模式
1,单例定义:
public class SingletonKerriganA { /** * 单例对象实例 */ private static SingletonKerriganA instance = null; public static SingletonKerriganA getInstance() { if (instance == null) { //line A instance = new SingletonKerriganA(); //line B } return instance; } }
?
public class SingletonKerriganB { /** * 单例对象实例 */ private static SingletonKerriganB instance = null; public synchronized static SingletonKerriganB getInstance() { if (instance == null) { instance = new SingletonKerriganB(); } return instance; } }
/** * 实现单例访问Kerrigan的第三次尝试 */ public class SingletonKerriganC { /** * 单例对象实例 */ private static SingletonKerriganC instance = null; public static SingletonKerriganC getInstance() { synchronized (SingletonKerriganC.class) { if (instance == null) { instance = new SingletonKerriganC(); } } return instance; } } ?
/** * 实现单例访问Kerrigan的第四次尝试 */ public class SingletonKerriganD { /** * 单例对象实例 */ private static SingletonKerriganD instance = null; public static SingletonKerriganD getInstance() { if (instance == null) { synchronized (SingletonKerriganD.class) { if (instance == null) { instance = new SingletonKerriganD(); } } } return instance; } } ?
/** * 实现单例访问Kerrigan的第五次尝试 */ public class SingletonKerriganE { /** * 单例对象实例 */ private static SingletonKerriganE instance = new SingletonKerriganE(); public static SingletonKerriganE getInstance() { return instance; } }
/** * 实现单例访问Kerrigan的第六次尝试 */ public class SingletonKerriganF { private static String arg = null; private static class SingletonHolder { /** * 单例对象实例 */ static final SingletonKerriganF INSTANCE = new SingletonKerriganF(); } public static SingletonKerriganF getInstance() { return SingletonHolder.INSTANCE; } public SingletonKerriganF() { System.out.println("Kerrigan get arg:" + getArg()); System.out.println("Kerrigan created!"); } public static String getArg() { return arg; } public static void setArg(String arg) { SingletonKerriganF.arg = arg; } public static void main(String[] args) { System.out.println("SingletonKerriganF was loaded,but SingletonKerriganF$SingletonHolder don't"); SingletonKerriganF.setArg("this maybe some config files etc...."); SingletonKerriganF.getInstance(); } }
??输出:?
/** * 能应对大多数情况的单例实现 */ public class SingletonKerrigan implements Serializable { private static class SingletonHolder { /** * 单例对象实例 */ static final SingletonKerrigan INSTANCE = new SingletonKerrigan(); } public static SingletonKerrigan getInstance() { return SingletonHolder.INSTANCE; } /** * private的构造函数用于避免外界直接使用new来实例化对象 */ private SingletonKerrigan() { } /** * readResolve方法应对单例对象被序列化时候 */ private Object readResolve() { return getInstance(); } }
?总结:
?