← Back to list

Builder Design Pattern Using Golang

What is Builder Design Pattern ?

Chandan Chiranjeeb Sahoo · 2026-06-17 14:48 · 0 claps · 2.1 min read
#builder-design-pattern #design-patterns #software-design-patterns #design-pattern-in-golang #golang-tutorial
Open on Medium ↗

Builder Design Pattern Using Golang

What is Builder Design Pattern ?

  • It is a creational design pattern that allows you to create step by step & lets you choose only the parts you need.

Why do we need it ?

  • Imagine creating a game character:
warrior := Character{
    Name:"Avenger",
    Health:100,
    Attack:20,
    Defence:15,
    Weapon:"Sword",
    Armor:"Steel Armor",
    Skill:"Fire Strike",
}
  • Now imagine the character has 20 fields, the constructor looks ugly.

Builder Solution

  • Build the object step by step
warrior := NewCharacterBuilder()
        .SetName("Avenger")
        .SetHealth(100)
        .SetAttack(20)
        .SetWeapon("Sword")
        .Build()
  • Now this is more readable

Code:

type Character struct {
    Name string
    Attack int
    Health int
    Defence int
    Weapon string
    Armor string
    Skill string
}

type CharacterBuilder struct {
    char Character
}
  • **Character is a struct (like a blueprint) that defines what a game character has (name, attack, health, weapon, etc.).**
  • CharacterBuilder is another struct used to help build or create a Character step by step.
  • It contains a char field, which stores the character being built inside the builder.
func NewCharacter()*CharacterBuilder{
    return &CharacterBuilder{}
}
  • NewCharacter is a constructor function that creates a new CharacterBuilder.
  • It returns a pointer to an empty builder object, ready to be used for building a character.
func(c *CharacterBuilder)SetName(val string)*CharacterBuilder{
    c.char.Name = val
    return c
}

func(c *CharacterBuilder)SetAttack(val int)*CharacterBuilder{
    c.char.Attack = val
    return c
}

func(c *CharacterBuilder)SetDefence(val int)*CharacterBuilder{
    c.char.Defence = val
    return c
}

func(c *CharacterBuilder)SetHealth(val int)*CharacterBuilder{
    c.char.Health = val
    return c
}

func(c *CharacterBuilder)SetWeapon(val string)*CharacterBuilder{
    c.char.Weapon = val
    return c
}

func(c *CharacterBuilder)SetArmor(val string)*CharacterBuilder{
    c.char.Armor = val
    return c
}

func(c *CharacterBuilder)SetSkill(val string)*CharacterBuilder{
    c.char.Skill = val
    return c
}
  • These are builder methods that set different fields (Name, Attack, Health, etc.) of the Character.
  • Each function updates one property inside the char object of CharacterBuilder.
  • After setting the value, they return the builder (c) itself so you can chain multiple calls together.
  • This pattern makes it easy to build a character step by step in a clean way.
func(c *CharacterBuilder)Build()Character {
    return c.char
}
  • This Build() function returns the completed character from the builder.
  • It is usually called at the end to get the final object after setting all values.
func main(){

    warrior := NewCharacter().SetName("Avenger").SetAttack(80).SetHealth(100).SetWeapon("Magic").Build()

    fmt.Println(warrior)

}
  • In main, a character is created step-by-step using method chaining (setting name, attack, health, and weapon).
  • Finally, Build() returns the complete character, and fmt.Println prints it.

Full Code :

package main

import (
    "fmt"
)

type Character struct {
    Name string
    Attack int
    Health int
    Defence int
    Weapon string
    Armor string
    Skill string
}

type CharacterBuilder struct {
    char Character
}

func NewCharacter()*CharacterBuilder{
    return &CharacterBuilder{}
}

func(c *CharacterBuilder)SetName(val string)*CharacterBuilder{
    c.char.Name = val
    return c
}

func(c *CharacterBuilder)SetAttack(val int)*CharacterBuilder{
    c.char.Attack = val
    return c
}

func(c *CharacterBuilder)SetDefence(val int)*CharacterBuilder{
    c.char.Defence = val
    return c
}

func(c *CharacterBuilder)SetHealth(val int)*CharacterBuilder{
    c.char.Health = val
    return c
}

func(c *CharacterBuilder)SetWeapon(val string)*CharacterBuilder{
    c.char.Weapon = val
    return c
}

func(c *CharacterBuilder)SetArmor(val string)*CharacterBuilder{
    c.char.Armor = val
    return c
}

func(c *CharacterBuilder)SetSkill(val string)*CharacterBuilder{
    c.char.Skill = val
    return c
}

func(c *CharacterBuilder)Build()Character {
    return c.char
}

func main(){

    warrior := NewCharacter().SetName("Avenger").SetAttack(80).SetHealth(100).SetWeapon("Magic").Build()

    fmt.Println(warrior)

}

Output:

{Avenger 80 100 0 Magic  }

메타데이터
post_id
cc609c3f23b7
slug
builder-design-pattern-using-golang-cc609c3f23b7
url
https://medium.com/@iamchiranjeeb/builder-design-pattern-using-golang-cc609c3f23b7
canonical_url
https://medium.com/@iamchiranjeeb/builder-design-pattern-using-golang-cc609c3f23b7
author_url
https://medium.com/@iamchiranjeeb
status
ok
fetched_at
2026-06-23 17:05:31