面試的時候,常常會被問到這樣一個問題:請您寫出一個單例模式(Singleton Pattern)吧。好吧,寫就寫,這還不容易。順手寫一個:
- public final class EagerSingleton
- {
- private static EagerSingleton singObj = new EagerSingleton();
- private EagerSingleton(){
- }
- public static EagerSingleton getSingleInstance(){
- return singObj;
- }
- }
這種寫法就是所謂的飢餓模式,每個對象在沒有使用之前就已經初始化了。這就可能帶來潛在的性能問題:如果這個對象很大呢?沒有使用這個對象之前,就把它加載到了內存中去是一種巨大的浪費。針對這種情況,我們可以對以上的代碼進行改進,使用一種新的設計思想——延遲加載(Lazy-load Singleton)。
- public final class LazySingleton
- {
- private static LazySingleton singObj = null;
- private LazySingleton(){
- }
- public static LazySingleton getSingleInstance(){
- if(null == singObj ) singObj = new LazySingleton();
- return singObj;
- }
- }
- public final class ThreadSafeSingleton
- {
- private static ThreadSafeSingleton singObj = null;
- private ThreadSafeSingleton(){
- }
- public static Synchronized ThreadSafeSingleton getSingleInstance(){
- if(null == singObj ) singObj = new ThreadSafeSingleton();
- return singObj;
- }
- }
- public final class DoubleCheckedSingleton
- {
- private static DoubleCheckedSingletonsingObj = null;
- private DoubleCheckedSingleton(){
- }
- public static DoubleCheckedSingleton getSingleInstance(){
- if(null == singObj ) {
- Synchronized(DoubleCheckedSingleton.class){
- if(null == singObj)
- singObj = new DoubleCheckedSingleton();
- }
- }
- return singObj;
- }
- }
- public class Singleton
- {
- private static class SingletonHolder
- {
- public final static Singleton instance = new Singleton();
- }
- public static Singleton getInstance()
- {
- return SingletonHolder.instance;
- }
- }