Pada modul ini kita akan membahas factory generator, yaitu jika diperlukan constructor untuk dengan role yang berbeda.
Ada dua pendekatan, yaitu pendekatan functional dan structural.
Skenarionya adalah, dibutuhkan factory function untuk membuat object employee dengan dua role berbeda yaitu kasir dan waiter. Disini akan digunakan pendekatan functional.
package main import "fmt" type Employee struct { Name, Position string AnnualIncome int } // functional approach func NewEmployeeFactory(position string, annualIncome int) func(name string) *Employee { return func(name string) *Employee { return &Employee{name, position, annualIncome} } } func main() { kasirFactory := NewEmployeeFactory("Kasir", 60000) waiterFactory := NewEmployeeFactory("Waiter", 50000) kasir := kasirFactory("Budi") fmt.Println(kasir) waiter := waiterFactory("Wati") fmt.Println(waiter) }
Berikut contoh pendekatan structural.
package main import "fmt" type Employee struct { Name, Position string AnnualIncome int } // structural approach type EmployeeFactory struct { Position string AnnualIncome int } func NewEmployeeFactory2(position string, annualIncome int) *EmployeeFactory { return &EmployeeFactory{position, annualIncome} } func (f *EmployeeFactory) Create(name string) *Employee { return &Employee{name, f.Position, f.AnnualIncome} } func main() { bossFactory := NewEmployeeFactory2("Owner", 100000) // dapat dilakukan modifikasi //bossFactory.AnnualIncome = 110000 boss := bossFactory.Create("Bambang") fmt.Println(boss) }
Keuntungan dengan pendekatan structural adalah, dapat melakukan data manipulasi. Lihat code diatas bagian baris comment.