DEV Community

ynwd
ynwd

Posted on

Design pattern in golang: builder

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 } 
Enter fullscreen mode Exit fullscreen mode
package main type DateOfBirth struct { year int month int day int } 
Enter fullscreen mode Exit fullscreen mode

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} } 
Enter fullscreen mode Exit fullscreen mode

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) } 
Enter fullscreen mode Exit fullscreen mode

Kesimpulan

Dengan builder pattern kita dapat membuat instance dari sebuah struct dan menambahkan validasi pada variabel-variabel yang akan menjadi input-nya.

Source code

https://play.golang.org/p/7nBzfPFT8ix

Top comments (0)