設計模式讀書筆記 單例模式

2021-09-09 00:16:07 字數 2398 閱讀 7965

有時候某些物件我們只需要乙個,如:執行緒池、快取、對話方塊等等,對於這類物件我們只能有乙個例項,如果我

們製造出多個例項,就會導致很多問題產生。

但是我們怎樣才能保證乙個類只有乙個例項並且能夠便於訪問?這裡我們想到了全域性變數,全域性變數確實是可以

保證該類可以隨時訪問,但是它很難解決只有乙個例項問題。最好的辦法就是讓該自身來負責儲存它的唯一例項。這

個類必須要保證沒有其他類來建立它。這裡我們可以將其構造方法私有化。即

public myclass

}

含有私有化構造器的類就能保證它不能被其他類例項化了。但是我們如何來獲取這個例項化類呢?提供乙個方法

用於返回該類的例項物件即可實現。

public class myclass 

public static myclass getinstance()

}

一、基本定義通過上面簡單介紹,我們可以對單例模式有乙個簡單的認識。所謂單例模式就是確保某乙個類只有乙個例項,並

且提供乙個全域性訪問點。

從上面可以看出單例模式有如下幾個特點:

一、它只有乙個例項。

二、它必須要自行例項化。

三、它必須自行想整個系統提供訪問點。

二、模式結構

單例模式可以說是最簡單的設計模式了,它僅有乙個角色singleton。

singleton:單例。

三、模式實現

public class singleton 

public static singleton getinstance()

return uniqueinstance; }

}

在《head  first》有這樣乙個場景,就是說有兩個執行緒都要執行這段**,很有可能會產生兩個例項物件。如下圖:

這裡有三種解決方案。

第一、  使用synchronized來處理。也就是說將getinstance()方法變成同步方法即可。

public class singleton 

public static synchronized singleton getinstance()

return uniqueinstance; }

}

第二、  直接初始化靜態變數。這樣就保證了執行緒安全。

public class singleton 

public static singleton getinstance()

}

第三、  用「雙重檢查加鎖」,在getinstance()中減少使用同步。

public class singleton 

/**

* 檢查例項,如果不存在,就進入同步區域

*/public static singleton getinstance()

}}

return uniqueinstance; }

}

在這裡是首先檢查是否例項已經建立了,如果尚未建立,才會進行同步。這樣一來。只有第一次會同步。

四、模式優缺點

優點

一、節約了系統資源。由於系統中只存在乙個例項物件,對與一些需要頻繁建立和銷毀物件的系統而言,單

例模式無疑節約了系統資源和提高了系統的效能。

二、因為單例類封裝了它的唯一例項,所以它可以嚴格控制客戶怎樣以及何時訪問它。

缺點

一、由於單例模式中沒有抽象層,因此單例類的擴充套件有很大的困難。

二、單例類的職責過重,在一定程度上違背了「單一職責原則」。

五、模式使用場景

下列幾種情況可以使用單例模式。

一、系統只需要乙個例項物件,如系統要求提供乙個唯一的序列號生成器,或者需要考慮資源消耗太大而只允許建立乙個物件。

二、客戶呼叫類的單個例項只允許使用乙個公共訪問點,除了該公共訪問點,不能通過其他途徑訪問該例項。

六、總結

1. 單例模式中確保程式中乙個類最多只有乙個例項。

2. 單例模式的構造器是私有了,而且它必須要提供例項的全域性訪問點。

3. 單例模式可能會因為多執行緒的問題而帶來安全隱患。

設計模式讀書筆記 單例模式

有時候某些物件我們只需要乙個,如 執行緒池 快取 對話方塊等等,對於這類物件我們只能有乙個例項,如果我 們製造出多個例項,就會導致很多問題產生。但是我們怎樣才能保證乙個類只有乙個例項並且能夠便於訪問?這裡我們想到了全域性變數,全域性變數確實是可以 保證該類可以隨時訪問,但是它很難解決只有乙個例項問題...

讀書筆記 設計模式(二) 單例模式

確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。確保某個類有且只有乙個物件的場景,避免產生多個物件消耗過多的資源,或者某種型別的物件只應該有且只有乙個。1 懶漢模式public class people public static synchronized people getin...

大話設計模式 讀書筆記2單例模式

這裡需要例項化但不使用new方式,可以在構造方法前面新增private,私有化構造方法。使用背景 所有類都有構造方法,不單獨編寫構造方法則系統預設使用空構造,單獨編寫構造方法的話,預設的構造器就會失效 然後需要單獨建立乙個公共方法來專門返回乙個類例項。在該方法中需要對是否例項化有乙個判斷,若沒有例項...