Sobes.tech
Middle

Mesélj a Factory mintáról.

sobes.tech MI

Válasz az MI-től

Gyár — ez egy létrehozó tervezési minta, amely közös interfészt biztosít az objektumok létrehozásához a szuperosztályban, míg az alosztályok módosíthatják a létrehozott objektumok típusát.

  • Egyszerű gyár (Simple Factory): Nem tiszta minta, inkább egy idiom. Egy osztály metódusa, amely az bemeneti paraméterek alapján hoz létre objektumokat.

    package main
    
    import "fmt"
    
    type Product interface {
    	Use()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Use() {
    	fmt.Println("Concrete Product A használata")
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Use() {
    	fmt.Println("Concrete Product B használata")
    }
    
    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()
    }
    
  • Gyármetódus (Factory Method): Interfész az objektum létrehozásához, de lehetővé teszi az alosztályoknak, hogy eldöntsék, melyik osztályt példányosítják.

    package main
    
    import "fmt"
    
    // Termék interfész
    type Product interface {
    	Operation() string
    }
    
    // Konkrét termék A
    type ConcreteProduct1 struct{}
    
    func (p *ConcreteProduct1) Operation() string {
    	return "A ConcreteProduct eredménye"
    }
    
    // Konkrét termék B
    type ConcreteProduct2 struct{}
    
    func (p *ConcreteProduct2) Operation() string {
    	return "B ConcreteProduct eredménye"
    }
    
    // Létrehozó interfész
    type Creator interface {
    	FactoryMethod() Product
    	SomeOperation() string
    }
    
    // Alap létrehozó struktúra
    type BaseCreator struct{}
    
    func (bc *BaseCreator) SomeOperation() string {
    	// A gyártási módszer meghívása a termék objektumának megszerzéséhez
    	product := bc.FactoryMethod()
    	// A termék használata
    	result := "A: Ugyanaz a kód, amely csak a " + product.Operation() + "-val működött"
    	return result
    }
    
    // Konkrét létrehozó A
    type ConcreteCreator1 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator1) FactoryMethod() Product {
    	return &ConcreteProduct1{} // Konkrét termék A létrehozása
    }
    
    // Konkrét létrehozó B
    type ConcreteCreator2 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator2) FactoryMethod() Product {
    	return &ConcreteProduct2{} // Konkrét termék B létrehozása
    }
    
    func main() {
    	// Használati példa
    	creator1 := &ConcreteCreator1{}
    	fmt.Println(creator1.SomeOperation())
    
    	creator2 := &ConcreteCreator2{}
    	fmt.Println(creator2.SomeOperation())
    }
    
  • Absztrakt gyár (Abstract Factory): Interfészt biztosít kapcsolódó vagy függő objektum családok létrehozásához anélkül, hogy azok konkrét osztályait megadná.

    package main
    
    import "fmt"
    
    // Termék A interfész
    type AbstractProductA interface {
    	UseProductA() string
    }
    
    // Konkrét termék A1
    type ConcreteProductA1 struct{}
    
    func (*ConcreteProductA1) UseProductA() string {
    	return "A termék A1 eredménye."
    }
    
    // Konkrét termék A2
    type ConcreteProductA2 struct{}
    
    func (*ConcreteProductA2) UseProductA() string {
    	return "A termék A2 eredménye."
    }
    
    // Termék B interfész
    type AbstractProductB interface {
    	UseProductB() string
    	AnotherFunctionB(collaborator AbstractProductA) string // Együttműködés a termék A-val
    }
    
    // Konkrét termék B1
    type ConcreteProductB1 struct{}
    
    func (*ConcreteProductB1) UseProductB() string {
    	return "B termék B1 eredménye."
    }
    
    func (*ConcreteProductB1) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("A B1 együttműködés eredménye (%s)", result)
    }
    
    // Konkrét termék B2
    type ConcreteProductB2 struct{}
    
    func (*ConcreteProductB2) UseProductB() string {
    	return "B termék B2 eredménye."
    }
    
    func (*ConcreteProductB2) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("A B2 együttműködés eredménye (%s)", result)
    }
    
    // Absztrakt gyár interfész
    type AbstractFactory interface {
    	CreateProductA() AbstractProductA
    	CreateProductB() AbstractProductB
    }
    
    // Konkrét gyár 1
    type ConcreteFactory1 struct{}
    
    func (*ConcreteFactory1) CreateProductA() AbstractProductA {
    	return &ConcreteProductA1{}
    }
    
    func (*ConcreteFactory1) CreateProductB() AbstractProductB {
    	return &ConcreteProductB1{}
    }
    
    // Konkrét gyár 2
    type ConcreteFactory2 struct{}
    
    func (*ConcreteFactory2) CreateProductA() AbstractProductA {
    	return &ConcreteProductA2{}
    }
    
    func (*ConcreteFactory2) CreateProductB() AbstractProductB {
    	return &ConcreteProductB2{}
    }
    
    // Ügyfélkód, amely a gyárat használja
    func ClientCode(factory AbstractFactory) {
    	productA := factory.CreateProductA()
    	productB := factory.CreateProductB()
    
    	fmt.Println(productB.UseProductB())
    	fmt.Println(productB.AnotherFunctionB(productA))
    }
    
    func main() {
    	fmt.Println("Ügyfél: Első gyártó típusával tesztelés:")
    	ClientCode(&ConcreteFactory1{})
    
    	fmt.Println("Ügyfél: Ugyanaz ügyfélkód második gyártó típusával tesztelés:")
    	ClientCode(&ConcreteFactory2{})
    }
    

A fő különbség a Gyármetódus és az Absztrakt gyár között: A Gyármetódus egyedi termékeket hoz létre, míg az Absztrakt gyár termékcsaládokat.

Név Leírás Mikor használjuk
Egyszerű gyár Egy osztály metódusa különböző típusú objektumok létrehozására. Egyszerű objektumok létrehozására, amikor nincs szükség hierarchiára.
Gyármetódus Interfész az objektum létrehozásához, amely lehetővé teszi az alosztályoknak, hogy eldöntsék, melyik osztályt példányosítják. Amikor az osztály nem tudja előre, milyen típusú objektumokat kell létrehoznia.
Absztrakt gyár Interfészt biztosít kapcsolódó vagy függő objektum családok létrehozásához. Amikor a rendszernek függetlennek kell lennie a termékek létrehozásának módjától és reprezentációjától.

A Gyár minta segít a laza kapcsolódásban és megkönnyíti az új típusú termékek hozzáadását anélkül, hogy módosítani kellene a klienskódot.