Golang設計模式之單例模式詳細講解

單例模式

單例是一種創建型設計模式, 讓你能夠保證一個類隻有一個實例, 並提供一個訪問該實例的全局節點。

單例擁有與全局變量相同的優缺點。 盡管它們非常有用, 但卻會破壞代碼的模塊化特性。

在某些其他上下文中, 你不能使用依賴於單例的類。 你也將必須使用單例類。 絕大多數情況下, 該限制會在創建單元測試時出現。

概念示例

通常而言, 單例實例會在結構體首次初始化時創建。 為瞭實現這一操作, 我們在結構體中定義一個 getInstance獲取實例方法。 該方法將負責創建和返回單例實例。 創建後, 每次調用 getInstance時都會返回相同的單例實例。

協程方面又有什麼需要註意的嗎? 每當多個協程想要訪問實例時, 單例結構體就必須返回相同的實例。 正因如此, 單例設計模式的實施工作很容易出錯。 下方的例子表示瞭創建單例的正確方式。

一些值得註意的地方:

最開始時會有 nil檢查, 確保 singleInstance單例實例在最開始時為空。 這是為瞭防止在每次調用 getInstance方法時都去執行消耗巨大的鎖定操作。 如果檢查不通過, 則就意味著 singleInstance字段已被填充。

singleInstance結構體將在鎖定期間創建。

在獲取到鎖後還會有另一個 nil檢查。 這是為瞭確保即便是有多個協程繞過瞭第一次檢查, 也隻能有一個可以創建單例實例。 否則, 所有協程都會創建自己的單例結構體實例。

single.go: 單例

package main
import (
    "fmt"
    "sync"
)
var lock = &sync.Mutex{}
type single struct {
}
var singleInstance *single
func getInstance() *single {
    if singleInstance == nil {
        lock.Lock()
        defer lock.Unlock()
        if singleInstance == nil {
            fmt.Println("Creating single instance now.")
            singleInstance = &single{}
        } else {
            fmt.Println("Single instance already created.")
        }
    } else {
        fmt.Println("Single instance already created.")
    }
    return singleInstance
}

main.go: 客戶端代碼

package main
import (
"fmt"
)
func main() {
    for i := 0; i < 30; i++ {
        go getInstance()
    }
    // Scanln is similar to Scan, but stops scanning at a newline and
    // after the final item there must be a newline or EOF.
    fmt.Scanln()
}

output.txt: 執行結果

Creating single instance now.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.
Single instance already created.

到此這篇關於Golang設計模式之單例模式詳細講解的文章就介紹到這瞭,更多相關Go單例模式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: