單例模式的五種實現方式

2021-07-31 23:51:55 字數 2089 閱讀 7079

單例模式:

無論在什麼時候,該類只有乙個例項。

實現單例模式的要點就是提供乙個私有的無參建構函式。

一、餓漢單例模式

public

class

singleobject

public

static singleobject getinstance()

}

二、懶漢單例模式

懶漢的意思就是慢悠悠的,不著急,也就是在呼叫方法的時候例項化物件,稱為延遲載入。

public

class

singleobject2

public

static singleobject2 getinstance() else

return object;

}}

在多執行緒環境下,上述的單例模式會出現多個例項,違背了單例模式的設計思想。那麼該如何解決這個問題呢?大家首先想到的肯定是給getinstance()方法加上synchronized關鍵字,這樣整個方法都上鎖了,效率非常低。

public

synchronized

static singleobject2 getinstance() else

return object;

}

嘗試同步**塊呢?

public

static singleobject2 getinstance() else

}return object;

}

此方法的執行效率也是非常低的,和sychronized同步getinstance()方法一樣是同步執行的。

如果對部分關鍵**上鎖呢?

public

static singleobject2 getinstance() else

}return object;

}

執行多執行緒測試,將發現會出現多個例項,是執行緒不安全的單例模式。

最後,對於上面的**,可以使用dcl雙重檢查機制實現多執行緒環境下的延遲載入的單例模式。

public

static singleobject2 getinstance() else }}

return object;

}

三、靜態內建類實現單例模式

dcl可以解決多執行緒下懶漢單例模式的非執行緒安全問題,使用靜態內部類可以達到同樣的效果。

public

class

singleobject3

private

static

class

singlefactory

public

static singleobject3 getinstance()

}

四、靜態**塊實現單例模式

靜態**塊在類載入的時候就會被初始化,因此可以使用該特性實現單例模式。

public

class

singleobject4

private

static singleobject4 object = null;

static

public

static singleobject4 getinstance()

}

五、使用enum實現單例模式

列舉和static**塊的特性相似,在使用列舉類時,會自動呼叫構造方法。

public

enum enumsingel

public object getinstance()

}

只需要呼叫列舉例項然後再呼叫getinstance()即可;

enumsingel.single.getinstance();

單例模式的五種實現方式

1.最容易想到的方式 public class singleton public static singleton getinstance public static void main string args 優點是 簡單 缺點是 無論用沒用到instsnce,都會進行初始化。2.延遲載入 laz...

Python 單例模式實現的五種方式

全域性變數 ip 192.168.13.98 port 3306 class mysql instance none def init self,ip,port self.ip ip self.port port classmethod def instance cls,args,kwargs if...

python單例模式的五種實現方式

1.new 特殊方法實現 class singleton def new cls,args,kwargs if nothasattr cls,instance cls.instance super singleton,cls new cls return cls.instance def init ...