Creational Design Pattern: Factory – Part 2

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()
}
Sharing is caring:

Leave a Comment