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.
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.
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
$ go run main.go
Kodingizni ishga tushiring