Creational Design Pattern: Builder – Part 4

Pada modul ini kita akan membahas cara menambahkan extension pada builder yang telah ada dengan menggunakan pendekatan functional programming.

Berikut contoh code penerapan function programming untuk melakukan extension pada builder.

package main

import "fmt"

type Person struct {
	name, position string
}

type personMod func(*Person)
type PersonBuilder struct {
	actions []personMod
}

func (b *PersonBuilder) Called(name string) *PersonBuilder {
	b.actions = append(b.actions, func(p *Person) {
		p.name = name
	})
	return b
}

func (b *PersonBuilder) Build() *Person {
	p := Person{}
	for _, a := range b.actions {
		a(&p)
	}
	return &p
}

// extend PersonBuilder
func (b *PersonBuilder) WorksAsA(position string) *PersonBuilder {
	b.actions = append(b.actions, func(p *Person) {
		p.position = position
	})
	return b
}

func main() {
	b := PersonBuilder{}
	p := b.Called("Budi").WorksAsA("Kasir").Build()
	fmt.Println(*p)
}

Idenya adalah membuat list dari aksi yang akan dilakukan, yang akan dieksekusi belakangan. Lihat code berikut:

type PersonBuilder struct {
	actions []personMod
}


Misalnya, fungsi awal yang dibuat adalah untuk mengisi data name.

func (b *PersonBuilder) Called(name string) *PersonBuilder {
	b.actions = append(b.actions, func(p *Person) {
		p.name = name
	})
	return b
}

Ketika dibutuhkan menambahkan data pekerjaa, dapat dilakukan extension pada builder.

func (b *PersonBuilder) WorksAsA(position string) *PersonBuilder {
	b.actions = append(b.actions, func(p *Person) {
		p.position = position
	})
	return b
}
Sharing is caring:

Leave a Comment