1. 程式人生 > >golang設計模式(1)單例模式

golang設計模式(1)單例模式

做軟體開發工程師兩三年了,接觸到的第一種設計模式就是單例模式,記得當年第一份工作第一個任務就是用C語言寫一個網路抓包的工具。那時候坐旁邊的同事就問,你們兩寫的這個工具有用到什麼設計模式嗎?當時一臉懵,設計模式是個什麼東西,那時候他說計算機專業有學過,但是看公司版本程式碼,他只看到了單例模式。從那時候開始我知道有設計模式這個事,學習也是從單例模式開始的。當然,設計模式中,單例模式也是最常用的一種。
golang也是我在第一家公司開始接觸的,那個時候我不知道為什麼好端端C++不用,非要用golang,讓我們幾個新來的學習golang,然後小組長帶著我們做專案。雖然那時候用golang做的專案,沒有涉及到多大的併發量,但是開發的時候確實是快,設計總體框架了以後我們按部就班的寫程式碼。專案整體是個分散式的架構,用了多種語言程式碼,有C++、C#、java等。最後確實是我們幾個新手用golang做的服務,相對來說比較的穩定,而且也開發效率高,bug也相對較少。從此golang就變成我非常感興趣的一門語言。
進入主題,首先,單例模式說白了,就是在整個golang單體服務中,如果說把所有csdn部落格比喻成一個服務,那麼所有原創的文章都是單例的。轉載出去的就不是單例的,如果轉載後由文章加上對應的使用者,如果將其封裝起來,也是獨一無二的。現在來看看集中golang單例模式的實現:

1、單例項只會被使用不會被賦值的時候。可以在對應package中定義例項物件,然後再init函式中對其賦初始值。注意物件名首字母需要大寫,否則其他模組無法使用。實現可以如下:

package tsingleton
func init() {
    TestSingleton = &Singleton{"keqian"}
}

type Singleton struct {
    Name string
}

var TestSingleton *Singleton

呼叫的時候直接呼叫包裡邊的變數即可:

import "tsingleton"
psttestsigleton := tsingleton.TestSingleton 

在單例例項不會被賦值,前例項提供的方法是可重入的時候,這樣子定義是最簡單的。

2、單例例項在使用過程中,有可能會被賦值(理論上認為是有可能發生的,比如編碼時候的失誤),這時候需要提供一個方法來獲取單例例項。實現可以如下:

package tsingleton
import (
    "fmt"
    "sync"
)

func init() {
    TestSingleton = &Singleton{"keqian"}
}

type Singleton struct {
    Name string
}

var TestSingleton *Singleton
var
singletonMutex sync.Mutex func NewSingleton() *Singleton { if TestSingleton == nil { singletonMutex.Lock() if TestSingleton == nil { TestSingleton = &Singleton{"keqian"} } singletonMutex.Unlock() } return TestSingleton }

那麼在使用的時候可以這樣:

tsingleton.NewSingleton().Name //這裡直接獲取變數,實際應用中可能就是呼叫對應方法等其他操作。

注意,在使用的時候儘可能的直接用呼叫獲取單例例項方法後接上要做的操作。這樣可以防止在使用過程中無意的將變數賦值。比如:

psttestsigleton := tsingleton.NewSingleton()
strname := psttestsigleton.Name
...
psttestsigleton = nil
...
strname2 := psttestsigleton.Name 

這種情況下,就有可能出現問題。果然在呼叫的時候都用tsingleton.NewSingleton()就可以避免這個問題。

總結:在不影響服務效能的情況下,最好使用第二種實現,輸入第一種實現比較簡單,但是在開發過程中容易遇到各種坑,比如單例變數被賦值為空後沒有修復的感知。第二種實現會比較合理一點,主要體現為開發者在使用的時候很明確這是一個單例例項,且不用擔心會被異常賦值。如果單例例項會頻繁地被用到,比如在一次完整服務呼叫流程會被使用多次,那麼就要考慮設計上是否合理。如果別無它發,那也可以不用函式呼叫的方式,但是使用者在使用的時候需要注意,不要給單例賦值。

相關推薦

golang設計模式1模式

做軟體開發工程師兩三年了,接觸到的第一種設計模式就是單例模式,記得當年第一份工作第一個任務就是用C語言寫一個網路抓包的工具。那時候坐旁邊的同事就問,你們兩寫的這個工具有用到什麼設計模式嗎?當時一臉懵,設計模式是個什麼東西,那時候他說計算機專業有學過,但是看公司版

23種設計模式1-模式

如果 static 拓展 銷毀 jvm垃圾收集器 單例類 不為 全局 返回值 定義: 單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。 特點:

設計模式1----模式

內存 內部 gin strong 系統 方法 main 重新 out 簡介: 單例模式(Singleton)是一種常用的軟件設計模式,在它的核心結構中只包含一個被稱為單例的特殊類。 定義: 確保一個類只有一個實例,而且自行實例化並向整個系統提供這個實例。 單例模式 單例模式

設計模式1——模式

虛擬 span 源碼 加載 定義 實例變量 不能 內存 而且 在Java開發過程中,很多場景下都會碰到或要用到單例模式,在設計模式裏也是經常作為指導學習的熱門模式之一,相信每位開發同事都用到過。我們總是沿著前輩的足跡去做設定好的思路,往往沒去探究為何這麽做,所以這篇文章對單

java設計模式---1模式

單例模式 定義: 確保一個類只有一個例項, 而且自行例項化並向整個系統提供這個例項 保證只有一個例項,只能是不讓外面訪問的類的構造方法,所以就構造方法寫成私有的,向整個系統提供一個例項那麼就只能定義一個static的例項返回回去了,所以程式碼可以這樣寫: public class Sin

設計模式1模式

**剛接觸設計模式的時候感覺很高大上的感覺,老師怎麼寫程式碼,就怎麼寫,沒有徹底的領會設計模式的深層次的思想。藉著複習的時間總結一下。** 1. 介紹:設計模式其實就是一種反覆使用的,多數人知曉的,經過分類編輯的程式碼設計經驗的總結。它停留在思想和經驗的層面

設計模式】—-1模式建立型

概念:  java中單例模式是一種常見的設計模式,單例模式的寫法有好幾種,這裡主要介紹三種:懶漢式單例、餓漢式單例、登記式單例。  單例模式有以下特點:  1、單例類只能有一個例項。  2、單例類必須自己建立自己的唯一例項。  3、單例類必須給所有其他物件提供這一例項。 

設計模式---模式

由於 div 懶漢式 其它 ins class single sin pub 1、簡介   作為對象的創建模式,單例模式確保某一個類只有一個實例,並且自行實例化並向整個系統提供這個實例,這個類稱為單例類 2、單例模式有以下三個特點   2.1、單例類只能有一個實例   

設計模式模式

分享 公有 交互 線程 加鎖 解決 操作 編譯 進入 1.單例模式(Singleton):由於某種需要,要保證一個類在程序的生命周期中只有一個實例,並提供一個該實例的全局訪問方法。 2.單例模式(Singleton)結構圖: Singleton類,定義了一個GetInst

跟著別人學設計模式-----模式詳解

    作者:zuoxiaolong8810(左瀟龍),轉載自:http://www.cnblogs.com/zuoxiaolong/p/pattern2.html             上一章

常用的軟體設計模式模式

單例模式:即一個類只有一個例項,在類裡自己建立自己的例項。 優點: (1)單例模式會阻止其他物件例項化其自己的單例物件的副本,從而確保所有物件都訪問唯一例項。 (2)因為類控制了例項化過程,所以類可以靈活更改例項化過程。尤其是在C++中,每次new都要delete,而是用單例模式可以避免

設計模式5模式

模式介紹 單例模式是一種建立型設計模式,其中一個類只保證只有一個例項,該例項可以全域性訪問。 這意味著該模式強制特定物件不具有可訪問的建構函式,並且對該物件執行的任何訪問都是在該物件的同一例項上執行的。 示例 我們模擬一下餐館裡用於通知上菜鈴鐺,它在櫃檯上只有一個。 下面程式碼中syncRoot是為

設計模式模式詳解

愉快的開始自己的技術積累 ,設計模式中使用最普遍的單例模式開始; 設計模式中最為大家熟悉的必須是單例模式,專案中 必須 使用到的套路。首先陳述下我對 框架,模式的一些理解。   從學校出來,開始面試的時候張口框架,閉口模式,真的問道什麼是框架,我只能死鴨子嘴硬的強調 MVC ,

PHP設計模式——模式Singleton Pattern

PHP設計模式(一)——單例模式(Singleton Pattern) 單例模式(Singleton Pattern):顧名思義,就是隻有一個例項。作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統提供這個例項。 (一)為

go 設計模式模式

go 的單例模式寫法比較簡單,可以通過sync.Once來輔助。 type Singleton struct { name string } var ( once sync.Once instance *Singleton ) func New()

設計模式模式

單例模式在日常使用非常平凡 一般有4種寫法 懶漢式 也稱為雙重鎖定 package com.zhy.pattern.singlton; public class Singleton02 { private static Singleton02 instance;

一個故事貫穿設計模式模式

   包結構:    類結構:      實現程式碼: package com.automannn.design_mode.singleton.test; import com.automannn.design_mode.singleton.OOP_class.

headfirst設計模式6模式

前言 這一章的課題看起來就很和藹可親了,比起前面繞的我不要不要的工廠模式,那感覺真是太好了,但是正是因為簡單,那麼問題就來了,我怎麼才能把這個東西敘述清楚?怎麼樣才能老少咸宜呢? 如何能夠在把這個東西講清楚的同時,引入一些新的東西讓這個設計模式能顯得不那麼普通呢?我不知道能不能做到,不過,吹x馬上開始

設計模式—— 模式

一、含義 在一個系統中,確保一個類只有一個例項,並提供一個全域性訪問點,這個類在系統中是獨一無二的。 二、要點 1.單例模式確保程式中最多隻有一個這個類的例項。 2.在java中實現單例模式需要把構造器私有化,並提供一個靜態方法和靜態變數。 三、分析單例模式 首先來看一下最經

設計模式——模式

單例模式,主要由以下幾個模組組成:私有的靜態物件例項,私有的構造方法(避免外部呼叫new物件,保證只有一個物件的例項),一個共有的靜態獲取物件的方法(供外部呼叫)。 程式碼如下: 懶漢式單例模式(在需要的時候,也即呼叫共有的靜態獲取物件的方法時才建立物件): packa