GoDasturchi
Builder Pattern

Builder Pattern

Builder (quruvchi) naqshi

Burger buyurtma qilayotganingizni tasavvur qiling: "katta burger, pishloq bilan, bekon bilan, lekin piyozsiz". Har bir qo'shimcha ixtiyoriy, va ularni ketma-ket, birma-bir aytasiz. Builder naqshi — aynan shu tarzda, murakkab obyektni qadam-baqadam, o'qilishi oson zanjir orqali yig'ish usuli.

Bu "Functional Options" naqshiga o'xshaydi (ikkalasi ham ixtiyoriy sozlashni yechadi), lekin farqi bor: Functional Options — funksiyalar ro'yxatini konstruktorga bittalikda beradi, Builder esa metodlarni zanjirlab (.WithX().WithY().Build()) chaqirishga imkon beradi, bu ba'zan o'qishda yanada tabiiyroq ko'rinadi.

example.go
package main

import "fmt"

type Burger struct {
	Bun    string
	Cheese bool
	Bacon  bool
}

type BurgerBuilder struct {
	burger Burger
}

func NewBurgerBuilder() *BurgerBuilder {
	return &BurgerBuilder{burger: Burger{Bun: "oddiy"}}
}

func (b *BurgerBuilder) WithCheese() *BurgerBuilder {
	b.burger.Cheese = true
	return b // o'zini qaytaradi — zanjirlash uchun
}

func (b *BurgerBuilder) WithBacon() *BurgerBuilder {
	b.burger.Bacon = true
	return b
}

func (b *BurgerBuilder) Build() Burger {
	return b.burger
}

func main() {
	burger := NewBurgerBuilder().WithCheese().WithBacon().Build()
	fmt.Println(burger.Cheese, burger.Bacon)
}

Zanjirlashning siri — har bir WithXxx metodi o'zini o'zi (b *BurgerBuilder) qaytaradi. Shu tufayli NewBurgerBuilder().WithCheese()ning natijasi yana *BurgerBuilder bo'lgani uchun, unga darhol .WithBacon()ni ulash mumkin — va hokazo, zanjir xohlagancha davom etishi mumkin. Faqat oxirida Build() chaqirilganda, yig'ilgan Burger qiymatining o'zi qaytariladi.

Bu naqsh ayniqsa ko'p, ixtiyoriy va bir-biriga bog'liq bo'lmagan qismlardan iborat murakkab obyekt (masalan HTTP so'rovi, SQL so'rovi, konfiguratsiya) qurishda o'qilishi ravon kodni ta'minlaydi — har bir qadam o'z nomi bilan, ketma-ket, tushunarli tartibda yoziladi.

>_ Exercise

BurgerBuilder'ga yangi qadam qo'shing.

  • WithLettuce() *BurgerBuilder metodini yozing: Burger'ga Lettuce bool maydonini true qilib qo'shing
  • NewBurgerBuilder().WithCheese().WithLettuce().Build() chaqirib, Cheese va Lettuce'ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Builder naqshida har bir "With" metodi o'zini qaytarib, metod zanjirlashni (.A().B().C()) ta'minlaydi — bu ko'p ixtiyoriy qadamli murakkab obyekt yaratishni o'qilishi ravon qiladi.

NEXT UP

Strategy Pattern

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

Builder Pattern

Builder (quruvchi) naqshi

Burger buyurtma qilayotganingizni tasavvur qiling: "katta burger, pishloq bilan, bekon bilan, lekin piyozsiz". Har bir qo'shimcha ixtiyoriy, va ularni ketma-ket, birma-bir aytasiz. Builder naqshi — aynan shu tarzda, murakkab obyektni qadam-baqadam, o'qilishi oson zanjir orqali yig'ish usuli.

Bu "Functional Options" naqshiga o'xshaydi (ikkalasi ham ixtiyoriy sozlashni yechadi), lekin farqi bor: Functional Options — funksiyalar ro'yxatini konstruktorga bittalikda beradi, Builder esa metodlarni zanjirlab (.WithX().WithY().Build()) chaqirishga imkon beradi, bu ba'zan o'qishda yanada tabiiyroq ko'rinadi.

example.go
package main

import "fmt"

type Burger struct {
	Bun    string
	Cheese bool
	Bacon  bool
}

type BurgerBuilder struct {
	burger Burger
}

func NewBurgerBuilder() *BurgerBuilder {
	return &BurgerBuilder{burger: Burger{Bun: "oddiy"}}
}

func (b *BurgerBuilder) WithCheese() *BurgerBuilder {
	b.burger.Cheese = true
	return b // o'zini qaytaradi — zanjirlash uchun
}

func (b *BurgerBuilder) WithBacon() *BurgerBuilder {
	b.burger.Bacon = true
	return b
}

func (b *BurgerBuilder) Build() Burger {
	return b.burger
}

func main() {
	burger := NewBurgerBuilder().WithCheese().WithBacon().Build()
	fmt.Println(burger.Cheese, burger.Bacon)
}

Zanjirlashning siri — har bir WithXxx metodi o'zini o'zi (b *BurgerBuilder) qaytaradi. Shu tufayli NewBurgerBuilder().WithCheese()ning natijasi yana *BurgerBuilder bo'lgani uchun, unga darhol .WithBacon()ni ulash mumkin — va hokazo, zanjir xohlagancha davom etishi mumkin. Faqat oxirida Build() chaqirilganda, yig'ilgan Burger qiymatining o'zi qaytariladi.

Bu naqsh ayniqsa ko'p, ixtiyoriy va bir-biriga bog'liq bo'lmagan qismlardan iborat murakkab obyekt (masalan HTTP so'rovi, SQL so'rovi, konfiguratsiya) qurishda o'qilishi ravon kodni ta'minlaydi — har bir qadam o'z nomi bilan, ketma-ket, tushunarli tartibda yoziladi.

>_ Exercise

BurgerBuilder'ga yangi qadam qo'shing.

  • WithLettuce() *BurgerBuilder metodini yozing: Burger'ga Lettuce bool maydonini true qilib qo'shing
  • NewBurgerBuilder().WithCheese().WithLettuce().Build() chaqirib, Cheese va Lettuce'ni chop eting

Stuck? Reveal a hint to help you.

Hints (0/3)

Key Takeaway

Key Takeaway:

Builder naqshida har bir "With" metodi o'zini qaytarib, metod zanjirlashni (.A().B().C()) ta'minlaydi — bu ko'p ixtiyoriy qadamli murakkab obyekt yaratishni o'qilishi ravon qiladi.

NEXT UP

Strategy Pattern