Go Design Corak #Singleton

Patricia Arquette
Lepaskan: 2024-10-08 06:08:30
asal
381 orang telah melayarinya

Go Design Patterns #Singleton

Corak reka bentuk ialah penyelesaian yang telah dicuba dan diuji kepada masalah biasa yang timbul dalam reka bentuk perisian. Mereka menyediakan templat atau panduan untuk menyelesaikan masalah ini dengan cara yang fleksibel dan boleh digunakan semula.

Setiap corak mewakili amalan terbaik yang pembangun boleh menyesuaikan diri dengan konteks khusus mereka. Corak reka bentuk selalunya dikelaskan kepada tiga kategori utama.

Untuk memulakan siri ini, mari bercakap tentang corak Singleton.

Singleton

Corak Singleton memastikan bahawa kelas hanya mempunyai satu tika dan menyediakan titik global akses kepada tika itu.

Ini berguna dalam kes di mana anda perlu mengurus sumber yang dikongsi, seperti sambungan pangkalan data atau tetapan konfigurasi.

Pernyataan Masalah

Selalunya terdapat keperluan untuk memastikan bahawa hanya satu contoh kelas wujud, seperti semasa mengurus konfigurasi atau berinteraksi dengan sumber perkakasan. Tanpa Singleton, mencipta berbilang kejadian boleh membawa kepada isu seperti data yang tidak konsisten atau kunci sumber.

Ini sangat biasa berlaku apabila bekerja dengan kod tak segerak, di mana berbilang gorouti boleh mencipta kejadian baharu kelas atau mengakses sumber kongsi.

Contoh Dunia Nyata

Pertimbangkan kumpulan sambungan pangkalan data: Jika beberapa bahagian aplikasi anda mencipta sambungan baharu pada masa yang sama, anda mungkin mengalami interaksi pangkalan data yang berlebihan atau bercanggah. Singleton memastikan hanya satu sambungan dibuat dan digunakan di seluruh aplikasi.

Perlaksanaan

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)
}
Salin selepas log masuk

Fungsi NewSingletonInstance memastikan bahawa hanya satu tika tunggal dibuat, walaupun dipanggil beberapa kali.

  • Pertama, ia menyemak sama ada tika adalah sifar (iaitu, tiada tika telah dibuat lagi).
  • Jika contoh adalah sifar, ia mengunci bahagian kod menggunakan lock.Lock() untuk menghalang berbilang goroutin daripada memasuki bahagian ini secara serentak.
  • Selepas mengunci, semakan kedua dilakukan untuk memastikan tiada goroutine lain mencipta tika antara semakan pertama dan masa kunci itu diperoleh.
  • Jika tika masih sifar, tika tunggal baharu dibuat dan diberikan kepada pembolehubah global.
  • Penyegerakan.Mutex dan penguncian yang disemak dua kali memastikan penciptaan tika tunggal adalah selamat untuk benang, menghalang berbilang goroutin daripada mencipta tika yang berasingan.

Atas ialah kandungan terperinci Go Design Corak #Singleton. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!