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