Pada praktek sehari-hari, Anda kemungkinan akan menemui kondisi dimana suatu komponen hanya boleh ada satu instance aktif didalam sistem.
Contohnya adalah database repository, misalnya pada awal program, isi database dibaca kedalam memory. Tentu Anda tidak memerlukan copy kedua, karena memang tidak dibutuhkan dan membuang resource.
Jadi Singleton adalah pattern untuk memastikan suatu object hanya di-instantiate satu kali saja.
Berikut contoh code menggunakan singleton dengan skenario, file capitals.txt akan diload ke memory, dan kita akan menampilkan data populasi kota tertentu, dalam hal ini Jakarta.
Penjelasan code terdapat pada baris comment.
package main import ( "bufio" "fmt" "os" "strconv" "sync" ) //digunakan huruf kecil s, agar tidak bisa diakses oleh user type singletonDatabase struct { capitals map[string]int } //fungsi untuk mengambil data jumlah populasi func (db *singletonDatabase) GetPopulation(name string) int { return db.capitals[name] } //fungsi untuk membaca file txt func readData(path string) (map[string]int, error) { file, err := os.Open(path) if err != nil { return nil, err } defer file.Close() scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanLines) result := map[string]int{} for scanner.Scan() { k := scanner.Text() scanner.Scan() v, _ := strconv.Atoi(scanner.Text()) result[k] = v } return result, nil } // digunakan sync.Once untuk memastikan suatu proses dijalankan 1 kali // sync.Once mempunyai fitur lazy, yaitu hanya akan dipanggil saat dibutuhkan var once sync.Once var instance *singletonDatabase func GetSingletonDatabase() *singletonDatabase { once.Do(func() { caps, e := readData(".\\capitals.txt") db := singletonDatabase{caps} if e == nil { db.capitals = caps } instance = &db }) return instance } func main() { db := GetSingletonDatabase() pop := db.GetPopulation("Jakarta") fmt.Println("Pop of Jakarta = ", pop) }
Isi file capitals.txt
Tokyo 33200000 New York 17800000 Sao Paulo 17700000 Seoul 17500000 Mexico City 17400000 Osaka 16425000 Manila 14750000 Mumbai 14350000 Delhi 14300000 Jakarta 14250000