package com.interview.design.pattern.creational; /** * Created_By: stefanie * Date: 14-12-2 * Time: 下午9:14 * * 单例对象能保证在一个JVM中,该对象只有一个实例存在 * * The difference between Singleton and Static Method * 首先,静态类不能实现接口。(从类的角度说是可以的,但是那样就破坏了静态了。因为接口中不允许有static修饰的方法,所以即使实现了也是非静态的) * 其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化。之所以延迟加载,是因为有些类比较庞大,所以延迟加载有助于提升性能。 * 再次,单例类可以被继承,他的方法可以被覆写。但是静态类内部方法都是static,无法被覆写。 * 最后一点,单例类比较灵活,毕竟从实现上只是一个普通的Java类,只要满足单例的基本需求,你可以在里面随心所欲的实现一些其它功能,但是静态类不行。 */ public class SingletonPattern { static class SingletonI{ public static SingletonI INSTANCE = new SingletonI(); //have a problem, if go exception in constructor, then INSTANCE will always be null, // better to put in getINSTANCE. private SingletonI(){ } } static class SingletonII{ private static SingletonII INSTANCE; private SingletonII(){ } public static SingletonII getInstance(){ if(INSTANCE == null){ INSTANCE = new SingletonII(); } return INSTANCE; } } //Singleton Pattern for Multi-Thread Accessing static class SingletonIII{ private static SingletonIII INSTANCE; private SingletonIII() { } private static synchronized void syncInit() { //separate creation and make it synchronize if (INSTANCE == null) { INSTANCE = new SingletonIII(); } } public static SingletonIII getINSTANCE() { if (INSTANCE == null) { syncInit(); } return INSTANCE; } } }