Builder pattern dipakai untuk membuat sebuah instance dari sebuah struct -- beserta dengan semua propertinya.
Perhatikan struct berikut:
package main
type User struct {
    name        string
    email       string
    address     string
    dateOfBirth DateOfBirth
}
package main
type DateOfBirth struct {
    year  int
    month int
    day   int
}
Implementasi pattern
package main
import (
    "fmt"
    "strconv"
    "strings"
)
func newUserBuilder() *User {
    return &User{}
}
func (u *User) Build() (User, error) {
    return User{
        name:        u.name,
        email:       u.email,
        address:     u.address,
        dateOfBirth: u.dateOfBirth,
    }, nil
}
func (u *User) SetName(name string) {
    u.name = name
}
func (u *User) SetEmail(email string) {
    u.email = email
}
func (u *User) SetAddress(address string) {
    u.address = address
}
func (u *User) SetDateOfBirth(dob string) {
    splitted := strings.Split(dob, "/")
    day, err := strconv.Atoi(splitted[0])
    if err != nil {
        u.dateOfBirth = DateOfBirth{}
    }
    month, err := strconv.Atoi(splitted[1])
    if err != nil {
        u.dateOfBirth = DateOfBirth{}
    }
    year, err := strconv.Atoi(splitted[2])
    if err != nil {
        u.dateOfBirth = DateOfBirth{}
    }
    u.dateOfBirth = DateOfBirth{day, month, year}
}
Bahkan, kalau mau, kamu dapat menambahkan validasi pada setiap variabel yang akan menjadi input -- sebelum ia dipakai oleh setiap properti dari sebuah struct.
Cara penggunaan
package main
func main() {
    builder := newUserBuilder()
    builder.SetName("agus")
    builder.SetAddress("cirebon")
    builder.SetEmail("agus@email.com")
    builder.SetDateOfBirth("01/01/2020")
    user, err := builder.Build()
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(user)
}
Kesimpulan
Dengan builder pattern kita dapat membuat instance dari sebuah struct dan menambahkan validasi pada variabel-variabel yang akan menjadi input-nya.
 

 
    
Top comments (0)