Go單例模式

單例模式回顧

以前在做java的時候扁耐,經(jīng)常會用到設(shè)計模式潦蝇,如單例模式款熬、工廠模式、觀察者模式等攘乒。其實設(shè)計模式和語言無關(guān)贤牛,先簡單回顧下單例模式吧,單例模式是一種用在特定場景的設(shè)計模式则酝。比如殉簸,讀取程序的配置文件的時候就會用到單列模式。

想象一下沽讹,假入有個類的實例是來對配置文件進(jìn)行操作喂链,如果不用單例模式,系統(tǒng)中任何用到讀取配置文件的地方都將會創(chuàng)建一個對象妥泉,這得多么浪費內(nèi)存椭微。

實際上該對象只需要被實例化一次即可。單例模式的抽象表達(dá)就是:在程序中我們只需要某個類實例化一次即可盲链,保證一個類僅有一個實例蝇率,并提供一個獲取實例的方法。

單例模式的實現(xiàn)

單例模式有懶漢式和餓漢式刽沾。在用Go實現(xiàn)之前本慕,先看看Java的實現(xiàn)。
在java中不管是懶漢式還是餓漢式都會將構(gòu)造方法私有化侧漓。這點不用解釋锅尘,因為不需要通過外部來實例化對象,把創(chuàng)建對象的權(quán)限封鎖布蔗。

懶漢式

所謂懶漢式藤违,也就是在創(chuàng)建對象時比較懶嘛,先不著急創(chuàng)建對象纵揍,在需要的時候才創(chuàng)建對象顿乒。這里看下java的實現(xiàn),暫不考慮并發(fā)問題泽谨,并發(fā)加上synchronized即可璧榄。

 1 public class Singleton {
 2    private static Singleton single = null;
 3    private Singleton(){
 4    }
 5    public static Singleton getSingle() {
 6        if (single == null) {
 7            single = new Singleton();
 8        }
 9        return single;
10    }
11}

那么上面的設(shè)計模式能否用Go語言實現(xiàn)呢特漩?答案是肯定的。Go語言沒有private這樣的權(quán)限控制骨杂,很簡單的是通過首字母大小寫來控制外部是否能夠訪問涂身。

 1 type config struct {
 2 }
 3
 4 var cfg *config
 5 func getInstane() *config {
 6     if cfg == nil { 
 7             cfg = new(Config)
 8             return cfg 
 9     }
10    return cfg
11}

上面沒有考慮線程安全,我們可以自己加鎖保證安全搓蚪,也可以用Golang 中的sync.Once結(jié)構(gòu)體访得,該結(jié)構(gòu)體提供了一個Do方法,Do函數(shù)里面的函數(shù)只有在第一次才會被調(diào)用陕凹,該方法只會生成一個實例,且也是線程安全的鳄炉。

 1 type config struct {
 2 }
 3
 4 var cfg *config
 5 var oSingle sync.Once
 6
 7 func getInstane() *config {
 8    oSingle.Do(
 9        func() {
10            cfg = new(config)
11        })
12    return cfg
13 }

餓漢式

餓漢模式和懶漢模式不同的只是在提供獲取實例的方法上杜耙。還是先來看下java的餓漢模式:

1 public class Singleton {
2    private static Singleton single = new Singleton();// 只會創(chuàng)建一次實例
3    private Singleton(){
4    }
5    public static Singleton getSingle() {
6        return single; // 直接返回
7 }

在go語言中,餓漢模式可以直接在init函數(shù)中初始化或者直接在全局變量中聲明拂盯。這區(qū)別于java中的變量必須是由static修飾佑女。因為static變量在類加載的時候進(jìn)行初始化。多個實例會共享這塊內(nèi)存空間谈竿。

關(guān)于為什么可以直接用全局變量团驱,下回再討論golang中的全局變量。

 1 type cfg struct {    
 2 } 
 3 var cfg *config
 4 func init()  {
 5    cfg = new(config)
 6 }
 7 // NewConfig 提供獲取實例的方法...
 8 func NewConfig() *config {
 9    return cfg
10 }
1 type config struct {    
2 } 
3 var cfg *config = new(config)
4 // NewConfig 提供獲取實例的方法...
5 func NewConfig() *config {
6    return cfg
7 }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末空凸,一起剝皮案震驚了整個濱河市嚎花,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌呀洲,老刑警劉巖紊选,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異道逗,居然都是意外死亡兵罢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進(jìn)店門滓窍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來卖词,“玉大人,你說我怎么就攤上這事吏夯〈蓑冢” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵噪生,是天一觀的道長舶替。 經(jīng)常有香客問我,道長杠园,這世上最難降的妖魔是什么顾瞪? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上陈醒,老公的妹妹穿的比我還像新娘惕橙。我一直安慰自己,他們只是感情好钉跷,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布弥鹦。 她就那樣靜靜地躺著,像睡著了一般爷辙。 火紅的嫁衣襯著肌膚如雪彬坏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天膝晾,我揣著相機與錄音栓始,去河邊找鬼。 笑死血当,一個胖子當(dāng)著我的面吹牛幻赚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播臊旭,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼落恼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了离熏?” 一聲冷哼從身側(cè)響起佳谦,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎滋戳,沒想到半個月后吠昭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡胧瓜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年矢棚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片府喳。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蒲肋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出钝满,到底是詐尸還是另有隱情兜粘,我是刑警寧澤,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布弯蚜,位于F島的核電站孔轴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碎捺。R本人自食惡果不足惜路鹰,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一贷洲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧晋柱,春花似錦优构、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碑诉,卻和暖如春彪腔,著一層夾襖步出監(jiān)牢的瞬間骡苞,已是汗流浹背穗熬。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留坤按,地道東北人泪幌。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像署照,于是被迫代替她去往敵國和親祸泪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容