Creational Design Pattern: Builder – Part 2

Dalam praktek programming sehari-hari, umumnya, cukup digunakan satu builder. Namun ada kalanya kita ingin memisahkan menjadi beberapa builder.

Berikut contoh penggunaan dua builder dengan skenario data personal yang memiliki informasi alamat tinggal dan pekerjaan.

package main

import "fmt"

type Person struct {
	//alamat
	StreetAddress, Postcode, City string
	//pekerjaan
	CompanyName, Position string
	AnnualIncome          int
}

//starting point untuk membuat object person
type PersonBuilder struct {
	person *Person // needs to be inited
}

//fungsi untuk melakukan inisialisasi
func NewPersonBuilder() *PersonBuilder {
	return &PersonBuilder{&Person{}}
}

func (it *PersonBuilder) Build() *Person {
	return it.person
}

//fungsi utilitas untuk menambahkan build pekerjaan
func (it *PersonBuilder) Works() *PersonJobBuilder {
	return &PersonJobBuilder{*it}
}

//fungsi utilitas untuk menambahkan build alamat
func (it *PersonBuilder) Lives() *PersonAddressBuilder {
	return &PersonAddressBuilder{*it}
}

//builder untuk tempat tinggal
type PersonAddressBuilder struct {
	PersonBuilder
}

//fungsi untuk menambahkan alamat
func (it *PersonAddressBuilder) At(
	streetAddress string) *PersonAddressBuilder {
	it.person.StreetAddress = streetAddress
	return it
}

//fungsi untuk menambahkan kota
func (it *PersonAddressBuilder) In(
	city string) *PersonAddressBuilder {
	it.person.City = city
	return it
}

//fungsi untuk menambahkan postcode
func (it *PersonAddressBuilder) WithPostcode(
	postcode string) *PersonAddressBuilder {
	it.person.Postcode = postcode
	return it
}

//builder untuk pekerjaan
type PersonJobBuilder struct {
	PersonBuilder
}

//fungsi untuk menambahkan nama perusahaan
func (pjb *PersonJobBuilder) At(
	companyName string) *PersonJobBuilder {
	pjb.person.CompanyName = companyName
	return pjb
}

//fungsi untuk menambahkan jabatan
func (pjb *PersonJobBuilder) AsA(
	position string) *PersonJobBuilder {
	pjb.person.Position = position
	return pjb
}

//fungsi untuk menambahkan gaji
func (pjb *PersonJobBuilder) Earning(
	annualIncome int) *PersonJobBuilder {
	pjb.person.AnnualIncome = annualIncome
	return pjb
}

func main() {
	pb := NewPersonBuilder()
	pb.
		Lives().
		At("Popies Lane").
		In("Bali").
		WithPostcode("43921").
		Works().
		At("Kafe PiKoPi").
		AsA("Barista").
		Earning(1000000)
	person := pb.Build()
	fmt.Println(*person)
}
Sharing is caring:

Leave a Comment