Jika object creation logic terlalu kompleks, solusi yang dapat digunakan adalah design pattern factory. Contohnya object struct yang memiliki field yang banyak, yang harus di-inisialisasi.
Berbeda dengan design pattern builder, factory bertujuan melakukan object creation dalam satu kali eksekusi.
Untuk menanganinya dapat digunakan dengan cara
- Fungsi terpisah, yaitu Factory function atau sering disebut juga constructor.
- Struct terpisah atau package terpisah.
Untuk jelasnya mari kita gunakan kode dibawah.
package main import "fmt" type Person struct { Name string Age int EyeCount int } func NewPerson(name string, age int) *Person { if age <= 16 { //business logic goes here } //inisialisasi jumlah mata yang valid adalah 2. return &Person{name, age, 2} } func main() { // initialize directly p := Person{"Budi", 22, 2} fmt.Println(p) // menggunakan constructor p2 := NewPerson("Wati", 21) p2.Age = 30 fmt.Println(p2) }
func NewPerson adalah Factory design pattern, dimana didalamnya kita bisa melakukan menambahkan business process logic, melakukan inisialisasi dengan default value.
Contoh kode diatas dibuat sederhana untuk menjelaskan konsepnya. Pada prakteknya Anda mungkin harus melakukan inisialisasi default value untuk list atau map yang komplek. Atau harus melakukan validasi input agar object creation sesuai aturan yang diharapkan.