GoDasturchi
Factory Pattern

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.

example.go
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.

Hints (0/3)

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

OUTPUT

$ go run main.go
Kodingizni ishga tushiring

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.

example.go
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.

Hints (0/3)

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