首頁  >  文章  >  後端開發  >  Go 設計模式#Singleton

Go 設計模式#Singleton

Patricia Arquette
Patricia Arquette原創
2024-10-08 06:08:30492瀏覽

Go Design Patterns #Singleton

設計模式是針對軟體設計中出現的常見問題的經過嘗試和測試的解決方案。他們提供了一個模板或指南,以靈活且可重複使用的方式解決這些問題。

每種模式都代表了開發人員可以適應其特定環境的最佳實踐。設計模式通常分為三大類。

為了開始這個系列,我們先來談談單例模式。

辛格頓

單例模式確保一個類別只有一個實例,並提供對該實例的全域存取點。

這在您需要管理共用資源(例如資料庫連線或設定設定)的情況下非常有用。

問題陳述

通常需要確保某個類別僅存在一個實例,例如在管理配置或與硬體資源互動時。如果沒有 Singleton,建立多個實例可能會導致資料不一致或資源鎖定等問題。

在使用非同步程式碼時,這種情況很常見,其中多個 goroutine 可以建立類別的新實例或存取共享資源。

現實世界的例子

考慮資料庫連接池:如果應用程式的多個部分同時建立新連接,則最終可能會出現冗餘或衝突的資料庫互動。單例確保在整個應用程式中僅建立和使用一個連線。

執行

package main

import (
    "fmt"
    "sync"
)

type Singleton interface {
    DoSomething() string
}

type singleton struct{}

var lock = &sync.Mutex{}

var instance *singleton

func NewSingletonInstance() *singleton {
    if instance == nil {
        lock.Lock()
        defer lock.Unlock()
        if instance == nil {
            fmt.Println("Creating single instance now.")
            instance = &singleton{}
        } else {
            fmt.Println("Single instance already created.")
        }
    } else {
        fmt.Println("Single instance already created.")
    }

    return instance
}

func (s *singleton) DoSomething() string {
    return "Doing something."
}

func main() {
    instance1 := NewSingletonInstance()
    instance2 := NewSingletonInstance()
    fmt.Printf("%p\n", instance1)
    fmt.Printf("%p\n", instance2)
}

函數 NewSingletonInstance 確保僅建立一個單例實例,即使多次呼叫也是如此。

  • 首先,它檢查實例是否為零(即尚未建立實例)。
  • 如果instance為nil,它會使用lock.Lock()鎖定該部分程式碼,以防止多個goroutine同時進入該部分。
  • 鎖定後,將執行第二次檢查,以確保在第一次檢查和取得鎖定之間沒有其他 Goroutine 建立該實例。
  • 如果實例仍然為零,則建立一個新的單例實例並將其指派給全域變數。
  • sync.Mutex 和雙重檢查鎖定確保單例實例的建立是執行緒安全的,防止多個 goroutine 建立單獨的實例。

以上是Go 設計模式#Singleton的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn