Pada modul ini akan dibahas penggunaan factory pattern menggunakan interface. Pendekatan ini cocok jika Anda tidak ingin user mengakses langsung object struct.
Perhatikan, person struct didefinisikan dengan huruf kecil agar tidak bisa diakses langsung. Jadi user hanya bisa mengakses struct melalui interface.
package main import "fmt" type Person interface { SayHello() } type person struct { name string age int } func (p *person) SayHello() { fmt.Printf("Hi, my name is %s, I'm %d", p.name, p.age) } func NewPerson(name string, age int) Person { return &person{name, age} } func main() { p := NewPerson("Budi", 21) p.SayHello() }
Dengan pendekatan diatas, kita juga bisa menggunakan struct lain. Contoh ditambahkan oldPerson struct dengan implementasi yang berbeda.
package main import "fmt" type Person interface { SayHello() } type person struct { name string age int } type oldPerson struct { name string age int } func (p *person) SayHello() { fmt.Printf("Hi, my name is %s, I'm %d", p.name, p.age) } func (p *oldPerson) SayHello() { fmt.Printf("Hi, I'm very old") } func NewPerson(name string, age int) Person { if age > 100 { return &oldPerson{name, age} } return &person{name, age} } func main() { // p := NewPerson("Budi", 21) // p.SayHello() p2 := NewPerson("Old", 121) p2.SayHello() }