java單例模式代碼 java單例模式詳解

java單例模式怎么創(chuàng)建對象

1. 說明

成都創(chuàng)新互聯(lián)公司是一家專注于成都做網(wǎng)站、網(wǎng)站建設、外貿營銷網(wǎng)站建設與策劃設計,醴陵網(wǎng)站建設哪家好?成都創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設十載,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:醴陵等地區(qū)。醴陵做網(wǎng)站價格咨詢:13518219792

1)單例模式:確保一個類只有一個實例,自行實例化并向系統(tǒng)提供這個實例

2)單例模式分類:餓單例模式(類加載時實例化一個對象給自己的引用),懶單例模式(調用取得實例的方法如getInstance時才會實例化對象)(java中餓單例模式性能優(yōu)于懶單例模式,c++中一般使用懶單例模式)

3)單例模式要素:

a)私有構造方法

b)私有靜態(tài)引用指向自己實例

c)以自己實例為返回值的公有靜態(tài)方法

2.實例

餓單例模式:

復制代碼代碼如下:

package com.wish.modedesign;

public class HungrySingleton {

private static HungrySingleton instance = new HungrySingleton();

private HungrySingleton(){

}

public static HungrySingleton getInstance(){

return instance;

}

如何寫一個簡單的單例模式?

一、基本的實現(xiàn)思路:

單例的實現(xiàn)主要是通過以下兩個步驟:

1、將該類的構造方法定義為私有方法,這樣其他處的代碼就無法通過調用該類的構造方法來實例化該類的對象,只有通過該類提供的靜態(tài)方法來得到該類的唯一實例;

2、在該類內提供一個靜態(tài)方法,當我們調用這個方法時,如果類持有的引用不為空就返回這個引用,如果類保持的引用為空就創(chuàng)建該類的實例并將實例的引用賦予該類保持的引用。

二、示范如下:

1、枚舉實現(xiàn)單例:

2、懶漢式線程不安全:

3、懶漢式線程安全:

4、餓漢式:

5、雙重校驗鎖:

6、靜態(tài)內部類:

擴展資料:

一、單列模式簡介:

單例模式是設計模式中最簡單的形式之一。這一模式的目的是使得類的一個對象成為系統(tǒng)中的唯一實例。要實現(xiàn)這一點,可以從客戶端對其進行實例化開始。因此需要用一種只允許生成對象類的唯一實例的機制,“阻止”所有想要生成對象的訪問。使用工廠方法來限制實例化過程。這個方法應該是靜態(tài)方法(類方法),因為讓類的實例去生成另一個唯一實例毫無意義。

二、懶漢與餓漢:

1、懶漢方式:指全局的單例實例在第一次被使用時構建。

2、餓漢方式:指全局的單例實例在類裝載時構建。

三、單例模式的三要點:

1、某個類只能有一個實例。

2、它必須自行創(chuàng)建這個實例。

3、它必須自行向整個系統(tǒng)提供這個實例。

四、優(yōu)缺點:

1、優(yōu)點:

①實例控制:單例模式會阻止其他對象實例化其自己的單例對象的副本,從而確保所有對象都訪問唯一實例。

②靈活性:因為類控制了實例化過程,所以類可以靈活更改實例化過程。

2、缺點:

①開銷:雖然數(shù)量很少,但如果每次對象請求引用時都要檢查是否存在類的實例,將仍然需要一些開銷??梢酝ㄟ^使用靜態(tài)初始化解決此問題。

②可能的開發(fā)混淆:使用單例對象(尤其在類庫中定義的對象)時,開發(fā)人員必須記住自己不能使用new關鍵字實例化對象。因為可能無法訪問庫源代碼,因此應用程序開發(fā)人員可能會意外發(fā)現(xiàn)自己無法直接實例化此類。

③對象生存期:不能解決刪除單個對象的問題。在提供內存管理的語言中(例如基于.NET Framework的語言),只有單例類能夠導致實例被取消分配,因為它包含對該實例的私有引用。在某些語言中(如 C++),其他類可以刪除對象實例,但這樣會導致單例類中出現(xiàn)懸浮引用。

參考資料:百度百科單列模式

單例模式代碼怎么寫?

 單例模式(Singleton) ,屬于最常見的設計模式之一,大部分系統(tǒng)都會用到,目的是為了維護系統(tǒng)中唯一的一個實例。

可分為eager模式,示例代碼如下:

Java代碼

1.class EagerSingleton{

2. private static final EagerSingleton m_instance = new EagerSingleton();

3. private EagerSingleton(){}

4. public static EagerSingleton getInstance(){

5. return m_instance;

6. }

7.}

class EagerSingleton{

private static final EagerSingleton m_instance = new EagerSingleton();

private EagerSingleton(){}

public static EagerSingleton getInstance(){

return m_instance;

}

}

和 lazy模式,示例代碼如下:

Java代碼

1.class LazySingleton{

2. private static LazySingleton m_instance = null;

3. private LazySingleton(){}

4. public synchronized static getInstance(){

5. if(m_instance == null){

6. m_instance = new LazySingleton();

7. }

8. return m_instance;

9. }

10.}

class LazySingleton{

private static LazySingleton m_instance = null;

private LazySingleton(){}

public synchronized static getInstance(){

if(m_instance == null){

m_instance = new LazySingleton();

}

return m_instance;

}

}

java源碼中,Runtime.getRuntime()就是單例的一個例子。

單例模式的精神就是整個系統(tǒng)中維護一個實例,推廣開來,如果在一個系統(tǒng)中需要維護多個示例,那么就產生了多例模式(multiton)。

多例模式(Multiton) ,通過聚集對象了保留自身的多個示例,根據(jù)客戶端的參數(shù)返回所需要的實例。

示例代碼如下:

Java代碼

1.class Multiton{

2. private final int INSTANCE_SIZE = 10;

3. private static Map instances = new HashMap(INSTANCE_SIZE);

4. private String name;

5. private Multiton(){}

6. private Multiton(String name){

7. this.name = name;

8. }

9. public synchronized static getInstance(String name){

10. if(instances.containsKey(name)){

11. return instances.get(name);

12. }

13. else{

14. ins = new Multiton(name);

15. instances.put(name, ins);

16. return ins;

17. }

18. }

19.}

class Multiton{

private final int INSTANCE_SIZE = 10;

private static Map instances = new HashMap(INSTANCE_SIZE);

private String name;

private Multiton(){}

private Multiton(String name){

this.name = name;

}

public synchronized static getInstance(String name){

if(instances.containsKey(name)){

return instances.get(name);

}

else{

ins = new Multiton(name);

instances.put(name, ins);

return ins;

}

}

}

[nextpage]

一個實用的例子就是KeyGenerator, 示例代碼如下:

Java代碼

1.class KeyGenerator{

2. private final int POOL_SIZE = 20;

3. private static Map instances = new HashMap(16);

4. private KeyInfo keyinfo;

5. private KeyGenerator(){}

6. private KeyGenerator(String keyName){

7. this.keyinfo = new KeyInfo(POOL_SIZE, keyName);

8. }

9. public synchronized static getInstance(String keyName){

10. if(instances.containsKey(keyName)){

11. return (KeyGenerator)instances.get(keyName);

12. }

13. else{

14. keyGen = new KeyGenerator(keyName);

15. instances.put(name, keyGen);

16. return keyGen;

17. }

18. }

19. public synzhronized int getNextKey(){

20. return keyinfo.getNextKey();

21. }

22. }

class KeyGenerator{

private final int POOL_SIZE = 20;

private static Map instances = new HashMap(16);

private KeyInfo keyinfo;

private KeyGenerator(){}

private KeyGenerator(String keyName){

this.keyinfo = new KeyInfo(POOL_SIZE, keyName);

}

public synchronized static getInstance(String keyName){

if(instances.containsKey(keyName)){

return (KeyGenerator)instances.get(keyName);

}

else{

keyGen = new KeyGenerator(keyName);

instances.put(name, keyGen);

return keyGen;

}

}

public synzhronized int getNextKey(){

return keyinfo.getNextKey();

}

}

新聞名稱:java單例模式代碼 java單例模式詳解
URL網(wǎng)址:http://muchs.cn/article36/doccppg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、企業(yè)建站虛擬主機、響應式網(wǎng)站網(wǎng)站制作、動態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設