Sobes.tech
Middle

Factory naqshining haqida gapir.

sobes.tech AI

AIdan javob

Fabrika — bu yaratish uchun mo'ljallangan dizayn shabloni bo'lib, u superklassda umumiy interfeysni taqdim etadi, podklasslar esa yaratilayotgan ob'ektlarning turini o'zgartirishlari mumkin.

  • Oddiy fabrika (Simple Factory): Bu toza shaklda shablon emas, balki idioma. Kirish parametrlariga asoslangan ob'ektlarni yaratadigan metodga ega sinf.

    package main
    
    import "fmt"
    
    type Product interface {
    	Use()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Use() {
    	fmt.Println("Concrete A mahsulotidan foydalanish")
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Use() {
    	fmt.Println("Concrete B mahsulotidan foydalanish")
    }
    
    type SimpleFactory struct{}
    
    func (f *SimpleFactory) CreateProduct(t string) Product {
    	switch t {
    	case "A":
    		return &ConcreteProductA{}
    	case "B":
    		return &ConcreteProductB{}
    	default:
    		return nil
    	}
    }
    
    func main() {
    	factory := SimpleFactory{}
    	productA := factory.CreateProduct("A")
    	productA.Use()
    
    	productB := factory.CreateProduct("B")
    	productB.Use()
    }
    
  • Fabrika metodi (Factory Method): Ob'ektni yaratish uchun interfeysni belgilaydi, lekin podklasslar qaysi klassni instansiyalashni hal qiladi.

    package main
    
    import "fmt"
    
    // Mahsulot interfeysi
    type Product interface {
    	Operation() string
    }
    
    // Aniq mahsulot A
    type ConcreteProduct1 struct{}
    
    func (p *ConcreteProduct1) Operation() string {
    	return "ConcreteProduct1 natijasi"
    }
    
    // Aniq mahsulot B
    type ConcreteProduct2 struct{}
    
    func (p *ConcreteProduct2) Operation() string {
    	return "ConcreteProduct2 natijasi"
    }
    
    // Yaratuvchi interfeysi
    type Creator interface {
    	FactoryMethod() Product
    	SomeOperation() string
    }
    
    // Asosiy yaratuvchi struktura
    type BaseCreator struct{}
    
    func (bc *BaseCreator) SomeOperation() string {
    	// Mahsulot ob'ektini olish uchun fabrika metodini chaqirish
    	product := bc.FactoryMethod()
    	// Mahsulot bilan ishlash
    	result := "Yaratuvchi: Bir xil yaratuvchining kodi hozirda " + product.Operation()
    	return result
    }
    
    // Aniq yaratuvchi A
    type ConcreteCreator1 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator1) FactoryMethod() Product {
    	return &ConcreteProduct1{} // Aniq mahsulot A ni yaratadi
    }
    
    // Aniq yaratuvchi B
    type ConcreteCreator2 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator2) FactoryMethod() Product {
    	return &ConcreteProduct2{} // Aniq mahsulot B ni yaratadi
    }
    
    func main() {
    	// Foydalanish misoli
    	creator1 := &ConcreteCreator1{}
    	fmt.Println(creator1.SomeOperation())
    
    	creator2 := &ConcreteCreator2{}
    	fmt.Println(creator2.SomeOperation())
    }
    
  • Abstrakt fabrika (Abstract Factory): Bog'langan yoki bog'liq bo'lgan ob'ektlar oilalarini yaratish uchun interfeys taqdim etadi, ularning aniq klasslarini ko'rsatmasdan.

    package main
    
    import "fmt"
    
    // Mahsulot A interfeysi
    type AbstractProductA interface {
    	UseProductA() string
    }
    
    // A1 mahsuloti
    type ConcreteProductA1 struct{}
    
    func (*ConcreteProductA1) UseProductA() string {
    	return "A1 mahsulotining natijasi."
    }
    
    // A2 mahsuloti
    type ConcreteProductA2 struct{}
    
    func (*ConcreteProductA2) UseProductA() string {
    	return "A2 mahsulotining natijasi."
    }
    
    // Mahsulot B interfeysi
    type AbstractProductB interface {
    	UseProductB() string
    	AnotherFunctionB(collaborator AbstractProductA) string // Mahsulot A bilan hamkorlik
    }
    
    // B1 mahsuloti
    type ConcreteProductB1 struct{}
    
    func (*ConcreteProductB1) UseProductB() string {
    	return "B1 mahsuloti natijasi."
    }
    
    // B1 bilan hamkorlik
    func (*ConcreteProductB1) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("B1 natijasi (%s) bilan hamkorlik qilish", result)
    }
    
    // B2 mahsuloti
    type ConcreteProductB2 struct{}
    
    func (*ConcreteProductB2) UseProductB() string {
    	return "B2 mahsuloti natijasi."
    }
    
    // B2 bilan hamkorlik
    func (*ConcreteProductB2) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("B2 natijasi (%s) bilan hamkorlik qilish", result)
    }
    
    // Abstrakt fabrika interfeysi
    type AbstractFactory interface {
    	CreateProductA() AbstractProductA
    	CreateProductB() AbstractProductB
    }
    
    // Konkret fabrika 1
    type ConcreteFactory1 struct{}
    
    func (*ConcreteFactory1) CreateProductA() AbstractProductA {
    	return &ConcreteProductA1{}
    }
    
    func (*ConcreteFactory1) CreateProductB() AbstractProductB {
    	return &ConcreteProductB1{}
    }
    
    // Konkret fabrika 2
    type ConcreteFactory2 struct{}
    
    func (*ConcreteFactory2) CreateProductA() AbstractProductA {
    	return &ConcreteProductA2{}
    }
    
    func (*ConcreteFactory2) CreateProductB() AbstractProductB {
    	return &ConcreteProductB2{}
    }
    
    // Mijoz kodi, fabrika bilan ishlash
    func ClientCode(factory AbstractFactory) {
    	productA := factory.CreateProductA()
    	productB := factory.CreateProductB()
    
    	fmt.Println(productB.UseProductB())
    	fmt.Println(productB.AnotherFunctionB(productA))
    }
    
    func main() {
    	fmt.Println("Mijoz: Birinchi turdagi fabrikani sinovdan o'tkazish:")
    	ClientCode(&ConcreteFactory1{})
    
    	fmt.Println("Mijoz: Ikkinchi turdagi fabrikani sinovdan o'tkazish:")
    	ClientCode(&ConcreteFactory2{})
    }
    

Asosiy farq Factory Method va Abstract Factory o'rtasida: Factory Method yagona mahsulotlarni yaratadi, Abstract Factory esa mahsulotlar oilalarini.

Pattern nomi Tavsifi Qachon foydalaniladi
Oddiy fabrika Bir sinfdagi metod yordamida turli xil ob'ektlarni yaratish. Oddiy ob'ektlarni yaratish uchun, fabrika ierarhiyasiga ehtiyoj yo'q.
Factory Method Ob'ekt yaratish uchun interfeys, podklasslar qaysi klassni instansiyalashni hal qiladi. Ob'ektlarning turini oldindan bilmaydigan holatlarda.
Abstract Factory Bog'langan yoki bog'liq bo'lgan ob'ektlar oilalarini yaratish uchun interfeys. Sistemalar mahsulotlarni yaratish va taqdim etish usulidan mustaqil bo'lishi kerak bo'lsa.

Fabrika shabloni kodning kamroq bog'liqligini ta'minlaydi va yangi mahsulot turlarini qo'shishni osonlashtiradi, mijoz kodini o'zgartirmasdan.