前言
單利模式是寫代碼過程中不可避免用到的,下面我總結一下單利常用的五種寫法,話不多說了,來一起看看詳細的介紹吧
加載類時創建單利
Java實現
public class Config{ private static Config INSTANCE=new Config(); private Config(){ //構造函數 } public static Config getInstance(){ return INSTANCE; }}
Kotlin實現
object Config{}
上面這種寫法簡單粗暴,直接在加載類的時候創建,但這樣會拖慢啟動進程,因此,可以在用到的時候再加載,比如下面這種寫法
懶加載寫法
Java實現
public class Config{ private static Config INSTANCE; private Config(){ //構造函數 } public static Config getInstance(){ if(null==INSTANCE){ INSTSANCE=new Config(); } return INSTANCE; }}
Kotlin實現
public class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.NONE){ Config() } }}
懶加載雖然避免在加載類的時候創建,但是線程不安全,如果同時多個類獲取單利,有可能會創建多個單利,因此可以在創建單利的時候加線程鎖,比如下面這種寫法:
同步鎖寫法
Java實現
public class Config{ private static Config INSTANCE; private Config(){ //構造函數 } public static synchronized Config getInstance(){ if(null==INSTANCE){ INSTANCE=new Config(); } return INSTANCE; }}
Kotlin實現
class Config{ companion object{ private var instance:Config?=null @Synchronized fun get():Config{ if(nnull==instance) instance=Config() return instance } }}
同步鎖避免單利不會被重復創建,但是同步鎖
雙重校驗寫法
Java實現
public class Config{ private static volatile Config INSTANCE; private Config(){ //構造函數 } public static Config getInstance(){ if(null==INSTANCE){ synchronized(Config.class){ if(null==INSTANCE){ INSTSANCE=new Config(); } } } return INSTANCE; }}
Kotlin實現
class Config{ companion object{ val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED){ Config() } }}
靜態內部類寫法
這種寫法避免了類加載的時候初始化單利,同時將同步鎖問題交給虛擬機處理,算得上是最優雅的寫法,Java和Kotlin寫法幾乎是一模一樣
Java實現
public class Config{ private static class Helper{ private static Config INSTANCE=new Config(); } private Config(){ //構造函數 } public static Config getInstance(){ return Helper.INSTANCE; }}
Kotlin實現
class Config private constructor(){ companion object{ fun getInstance = Helper.instance } private object Helper{ val instance = Config() }}
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。
|
新聞熱點
疑難解答