DEV Community

ynwd
ynwd

Posted on

2

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

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay