最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

【設(shè)計模式(三)】單例模式——單例有幾種寫法?

2019-07-29 00:39 作者:HarrickHeng  | 我要投稿

有一回對我說道,“你寫過編程么?”我略略點一點頭.他說,“寫過,……我便考你一考.單例模式,是怎樣寫的?”我想,討飯一樣的人,也配考我么?便回過臉去,不再理會.孔乙己等了許久,很懇切的說道,“不能寫罷?……我教給你,記著!

單例模式(Singleton Pattern)

單例模式是 Java 中最簡單的設(shè)計模式之一。這種模式涉及到一個單一的類,該類負責創(chuàng)建自己的對象,同時確保只有單個對象被創(chuàng)建。這個類提供了一種訪問其唯一的對象的方式,可以直接訪問,不需要實例化該類的對象。

單例模式三要素:1.單例類只能有一個實例。 2.單例類必須自己創(chuàng)建自己的唯一實例。 3.單例類必須給所有其他對象提供這一實例。

應用場景

1.游戲開發(fā)中的跟隨主角視角的攝像頭,一般只有一個

2.要求生產(chǎn)唯一序列號,用來防偽

3.WEB 中的計數(shù)器,不用每次刷新都在數(shù)據(jù)庫里加一次,用單例先緩存起來

4.創(chuàng)建的一個對象需要消耗的資源過多,比如 I/O 與數(shù)據(jù)庫的連接等

?

單例模式的四種寫法

雖然演示語言是typescript,最終以javascript實現(xiàn),而js沒有多線程,不用考慮線程安全問題。但筆者依然會列出其中的線程安全問題,ts不考慮,java、c還是要的。

懶漢模式

class SingleTest {
? ?private static instance: SingleTest;
? ?constructor() {

? ?}

? ?public static getInstance(): SingleTest {
? ? ? ?if(this.instance == null)
? ? ? ? ? ?this.instance = new SingleTest();
? ? ? ?return this.instance;
? ?}
}

這是最基本的實現(xiàn)方式,為什么叫懶漢?因為要等別人調(diào)用了你才實例化對象,有夠懶的。缺點很明顯:不支持多線程。如果要保證線程安全,需要加鎖synchronized,當然也會影響效率。

餓漢模式

class Singleton { ?
? ?private static instance:Singleton ?= new Singleton(); ?
? ?constructor (){} ?
? ?public static getInstance(): Singleton { ?
? ?return this.instance; ?
? ?} ?
}

很常用的模式。為什么叫餓漢?因為類在裝載的時候你就實例化了,別人還沒上桌你就吃完了,餓死鬼投胎!容易寫,而且執(zhí)行效率會提高。缺點也很明顯:類加載時就初始化,浪費內(nèi)存,容易產(chǎn)生垃圾對象。


以下模式為多線程語言的設(shè)計模式,所以不用ts演示了。

雙檢鎖/雙重校驗鎖(DCL,即 double-checked locking)

public class Singleton { ?
? ?private volatile static Singleton singleton; ?
? ?private Singleton (){} ?
? ?public static Singleton getSingleton() { ?
? ?if (singleton == null) { ?
? ? ? ?synchronized (Singleton.class) { ?
? ? ? ?if (singleton == null) { ?
? ? ? ? ? ?singleton = new Singleton(); ?
? ? ? ?} ?
? ? ? ?} ?
? ?} ?
? ?return singleton; ?
? ?} ?
}

這種方式采用雙鎖機制,安全且在多線程情況下能保持高性能。

登記式/靜態(tài)內(nèi)部類

public class Singleton { ?
? ?private static class SingletonHolder { ?
? ?private static final Singleton INSTANCE = new Singleton(); ?
? ?} ?
? ?private Singleton (){} ?
? ?public static final Singleton getInstance() { ?
? ?return SingletonHolder.INSTANCE; ?
? ?} ?
}

這種方式能達到雙檢鎖方式一樣的功效,但實現(xiàn)更簡單。對靜態(tài)域使用延遲初始化,應使用這種方式而不是雙檢鎖方式。這種方式只適用于靜態(tài)域的情況,雙檢鎖方式可在實例域需要延遲初始化時使用。

枚舉

public enum Singleton { ?
? ?INSTANCE; ?
? ?public void whateverMethod() { ?
? ?} ?
}

實現(xiàn)單例模式的最佳方法。它更簡潔,自動支持序列化機制,絕對防止多次實例化。但是需要JDK1.5 之后加入的enum 特性才可使用。

?

孔乙己顯出極高興的樣子,將兩個指頭的長指甲敲著柜臺,點頭說,“對呀對呀!……單例模式有四樣寫法,你知道么?

我的博客園:https://www.cnblogs.com/harrickheng/


【設(shè)計模式(三)】單例模式——單例有幾種寫法?的評論 (共 條)

分享到微博請遵守國家法律
晋中市| 安远县| 新密市| 崇文区| 甘德县| 禄丰县| 汉沽区| 亚东县| 湟源县| 信宜市| 井冈山市| 廉江市| 马鞍山市| 隆回县| 石台县| 瑞安市| 万载县| 都昌县| 北安市| 灵丘县| 浦县| 凌源市| 石屏县| 富顺县| 淮滨县| 乳源| 兖州市| 拜泉县| 滦南县| 石首市| 镇原县| 陈巴尔虎旗| 九台市| 丹江口市| 乌苏市| 郯城县| 上虞市| 通道| 越西县| 当涂县| 武定县|