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()
}