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.