Creational Design Pattern: Singleton – Part 1

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
Sharing is caring:

Leave a Comment