單例設計模式
java 實現
方式1
package com.demanmath.androidms.single; import com.demanmath.androidms.base.TraceLog; public class SingleDemo { private static SingleDemo instance = null; private SingleDemo(){ TraceLog.i(); } public static synchronized SingleDemo getInstance(){ if(instance == null){ instance = new SingleDemo(); } return instance; } }
線程安全,效率不高,內存延遲申請。
方式2
package com.demanmath.androidms.single; import com.demanmath.androidms.base.TraceLog; public class SingleDemo2 { private static SingleDemo2 singleDemo2 = new SingleDemo2(); private SingleDemo2(){ TraceLog.i(); } public static SingleDemo2 getInstance(){ return singleDemo2; } }
線程安全,效率高,內存延遲申請。 static的內容,只有在第一次使用的時候,纔會被初始化。也就是類加載的時候。由於是單例,所以只有第一次加載的時候,纔會new。 so,這個方式,不會導致進程啓動的時候,就會被加載進來。thus,這個方式最合適的單例方式。
方式3
package com.demanmath.androidms.single; import com.demanmath.androidms.base.TraceLog; public class SingleDemo3 { private SingleDemo3(){ TraceLog.i(); } public static class SingleInner{ private static final SingleDemo3 instance = new SingleDemo3(); } public static SingleDemo3 getInstance(){ return SingleInner.instance; } }
package com.demanmath.androidms.single; public enum SingleDemo4 { instace; public void operator(){} }
kotlin 實現
package com.demanmath.androidms.single import com.demanmath.androidms.base.TraceLog enum class SingleKtDemo3(){ instance; init{ TraceLog.i() } } package com.demanmath.androidms.single import com.demanmath.androidms.base.TraceLog class SingleKtDemo private constructor() { init { TraceLog.i() } companion object{ val instance = SingleKtDemo() } }