ios單例模式優(yōu)缺點(diǎn) 單例模式和全局靜態(tài)變量的區(qū)別?
單例模式和全局靜態(tài)變量的區(qū)別?1. 單例特性:確保只有一個(gè)類(lèi)的唯一實(shí)例存在。類(lèi)本身初始化自己。獲取唯一實(shí)例的方法非常清楚??梢酝ㄟ^(guò)類(lèi)本身定義的靜態(tài)方法getInstance()獲取類(lèi)的唯一實(shí)例引用。2
單例模式和全局靜態(tài)變量的區(qū)別?
1. 單例特性:確保只有一個(gè)類(lèi)的唯一實(shí)例存在。類(lèi)本身初始化自己。獲取唯一實(shí)例的方法非常清楚。可以通過(guò)類(lèi)本身定義的靜態(tài)方法getInstance()獲取類(lèi)的唯一實(shí)例引用。2靜態(tài)變量定義類(lèi)的實(shí)例引用特性:類(lèi)實(shí)例引用的靜態(tài)變量可以在任何文檔類(lèi)中定義。獲取類(lèi)實(shí)例引用的靜態(tài)變量。您可以定義靜態(tài)變量的類(lèi)名,并通過(guò)點(diǎn)語(yǔ)法訪(fǎng)問(wèn)引用。靜態(tài)變量可以在任何位置重新賦值。Singleton模式是對(duì)靜態(tài)變量方法造成的缺陷的改進(jìn),創(chuàng)建一個(gè)類(lèi)實(shí)例引用
在Singleton中,lazy和hungry的本質(zhì)區(qū)別如下:
1。饑餓模式是線(xiàn)程安全的。已經(jīng)為系統(tǒng)創(chuàng)建了一個(gè)靜態(tài)對(duì)象,以便在創(chuàng)建類(lèi)時(shí)使用,以后不會(huì)更改。Lazy如果實(shí)例對(duì)象是在沒(méi)有同步的情況下創(chuàng)建的,那么對(duì)該對(duì)象的訪(fǎng)問(wèn)就不是線(xiàn)程安全的。
2. 在實(shí)現(xiàn)方面,它們之間最大的區(qū)別是延遲加載。它在需要時(shí)創(chuàng)建對(duì)象,而饑餓模式是在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建的。饑餓模式不需要注意多線(xiàn)程。書(shū)寫(xiě)方法簡(jiǎn)單明了,可以使用。但是當(dāng)類(lèi)被加載時(shí),它會(huì)創(chuàng)建一個(gè)實(shí)例。因此,如果是工廠(chǎng)模式,緩存了很多實(shí)例,就要考慮效率,因?yàn)橐坏┘虞d了類(lèi),不管是否使用,都會(huì)創(chuàng)建所有實(shí)例。
3. 建立單一目標(biāo)的時(shí)間不同。“l(fā)azy類(lèi)型”是在您真正使用它時(shí)創(chuàng)建這個(gè)單例對(duì)象,而“hungry類(lèi)型”是在開(kāi)始時(shí)創(chuàng)建這個(gè)單例對(duì)象,不管您是否需要它。singleton模式的優(yōu)點(diǎn)是:(1)實(shí)例控制:singleton模式防止其他對(duì)象實(shí)例化自己的singleton對(duì)象副本,從而確保所有對(duì)象訪(fǎng)問(wèn)唯一的實(shí)例。(2) 靈活性:因?yàn)轭?lèi)控制實(shí)例化過(guò)程,所以類(lèi)可以靈活地更改實(shí)例化過(guò)程。2singleton模式的缺點(diǎn)是:(1)開(kāi)銷(xiāo):雖然數(shù)量很少,但是如果每次對(duì)象請(qǐng)求引用時(shí)都需要檢查類(lèi)的實(shí)例是否存在,那么仍然需要一些開(kāi)銷(xiāo)。您可以通過(guò)使用靜態(tài)初始化來(lái)解決這個(gè)問(wèn)題。(2) 可能的開(kāi)發(fā)混亂:當(dāng)使用單例對(duì)象(尤其是類(lèi)庫(kù)中定義的對(duì)象)時(shí),開(kāi)發(fā)人員必須記住他們不能用new關(guān)鍵字實(shí)例化對(duì)象。由于庫(kù)的源代碼可能無(wú)法訪(fǎng)問(wèn),應(yīng)用程序開(kāi)發(fā)人員可能會(huì)意外地發(fā)現(xiàn)自己無(wú)法直接實(shí)例化此類(lèi)。
單例模式中,餓漢式和懶漢式的區(qū)別?為什么推薦說(shuō),用餓漢模式?
單例模式也是一種常見(jiàn)的設(shè)計(jì)模式。它能給我們帶來(lái)什么好處?實(shí)際上,它有三個(gè)功能:一是控制資源的使用,通過(guò)線(xiàn)程同步控制資源的并發(fā)訪(fǎng)問(wèn);二是控制實(shí)例數(shù),達(dá)到節(jié)約資源的目的。第三,作為一種通信媒介,即數(shù)據(jù)共享,它可以在不建立直接關(guān)聯(lián)的情況下實(shí)現(xiàn)多個(gè)無(wú)關(guān)線(xiàn)程或進(jìn)程之間的通信。例如,數(shù)據(jù)庫(kù)連接池的設(shè)計(jì)一般采用單例模式。數(shù)據(jù)庫(kù)連接是數(shù)據(jù)庫(kù)資源
單例模式,即一個(gè)類(lèi)只能有一個(gè)實(shí)例。無(wú)論何時(shí),誰(shuí)請(qǐng)求,都是同一個(gè)實(shí)例。
單例模式,每種語(yǔ)言都有自己的實(shí)現(xiàn)方式,這里我以Java為例。實(shí)現(xiàn)單例的方法有很多。如果您想要最簡(jiǎn)單和最完美的實(shí)現(xiàn),請(qǐng)參閱以下代碼。這是我?guī)滋烨敖o朋友解釋辛格爾頓時(shí)寫(xiě)的。
Java collection framework的作者Joshua Bloch在《有效的Java》一書(shū)中推薦了這種寫(xiě)作方式枚舉型的單元素已成為實(shí)現(xiàn)“單例”的最佳途徑。
看起來(lái)不簡(jiǎn)單嗎?單例枚舉非常簡(jiǎn)單,可以保證多線(xiàn)程并發(fā)訪(fǎng)問(wèn)的安全性,防止序列化和反射。