Factory Pattern
Factory (zavod) naqshi
Konstruktor funksiyalarni (NewXxx) allaqachon ko'rgan edingiz — ular bitta aniq turni yaratadi. Factory naqshi esa bir qadam oldinga o'tadi: bitta funksiya, berilgan parametrga (masalan matn nomi) qarab, turli xil turlardan birini yaratib beradi — hammasi bitta umumiy interfeys ortida.
Buni avtomobil zavodiga o'xshating: siz "sedan" yoki "yuk mashinasi" deb buyurtma berasiz, zavod esa qaysi konveyer liniyasidan, qanday qismlardan yig'ish kerakligini o'zi hal qiladi — sizga faqat tayyor mashina kerak.
package main
import "fmt"
type Shape interface {
Area() float64
}
type Circle struct{ Radius float64 }
func (c Circle) Area() float64 { return 3.14 * c.Radius * c.Radius }
type Square struct{ Side float64 }
func (s Square) Area() float64 { return s.Side * s.Side }
func NewShape(kind string) Shape {
switch kind {
case "circle":
return Circle{Radius: 2}
case "square":
return Square{Side: 3}
default:
return nil
}
}
func main() {
s := NewShape("square")
fmt.Println(s.Area())
}NewShape — bu "zavod funksiyasi": u kind ("qanday shakl kerak") parametriga qarab, Circle yoki Squarening tayyor nusxasini, ikkalasi ham amalga oshiradigan Shape interfeysi ko'rinishida qaytaradi. Chaqiruvchi kod (main) Circle yoki Square haqida umuman bilishi shart emas — u faqat Shape interfeysi (Area()) bilan ishlaydi.
Bu naqsh qachon foydali? Ayniqsa, qaysi aniq tur kerakligi ishga tushish vaqtida (masalan konfiguratsiya fayli yoki foydalanuvchi kiritmasi asosida) ma'lum bo'ladigan holatlarda: NewLogger(cfg.LogType), NewPaymentGateway(cfg.Provider) kabi — kod barcha mumkin bo'lgan variantlarni bitta joyda ("zavod" ichida) markazlashtiradi.
>_ Exercise
Zavodga yangi shakl qo'shing.
- •Triangle struct'i (Base, Height float64) yozing, Area() metodi bilan (Base*Height/2)
- •NewShape'ga "triangle" holatini qo'shing: Triangle{Base: 4, Height: 5} qaytarsin
- •NewShape("triangle").Area() natijasini chop eting
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Factory naqshi bir nechta turdagi obyekt yaratishni bitta funksiyada markazlashtiradi, chaqiruvchi esa faqat umumiy interfeys bilan ishlaydi — qaysi aniq tur yaratilgani uning uchun ahamiyatsiz.
NEXT UP
Builder Pattern
$ go run main.go
Kodingizni ishga tushiring