Creational Design Pattern: Factory – Part 3

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.

Sharing is caring:

Leave a Comment