Sobes.tech
Middle

Factory nümunəsi haqqında danış.

sobes.tech Süni İntellekt

AI-dan cavab

Fabrika — bu yaradıcı dizayn nümunəsidir ki, ümumi interfeys təmin edir obyektlərin yaradılması üçün superklassda, altklaslar isə yaradılan obyektlərin növünü dəyişə bilər.

  • Sadə Fabrika (Simple Factory): Bu, tam bir nümunə deyil, daha çox bir ifadədir. Parametrlərə əsasən obyektlər yaradan metod olan sinif.

    package main
    
    import "fmt"
    
    type Product interface {
    	Use()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Use() {
    	fmt.Println("Concrete Product A istifadə olunur")
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Use() {
    	fmt.Println("Concrete Product B istifadə olunur")
    }
    
    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 Metodu (Factory Method): Interfeys təmin edir obyektin yaradılması üçün, lakin altklaslar hansı sinfi instansiya edəcəyinə qərar verir.

    package main
    
    import "fmt"
    
    // Məhsul interfeysi
    type Product interface {
    	Operation() string
    }
    
    // Konkret məhsul A
    type ConcreteProduct1 struct{}
    
    func (p *ConcreteProduct1) Operation() string {
    	return "ConcreteProduct1-in nəticəsi"
    }
    
    // Konkret məhsul B
    type ConcreteProduct2 struct{}
    
    func (p *ConcreteProduct2) Operation() string {
    	return "ConcreteProduct2-in nəticəsi"
    }
    
    // Yaradıcı interfeysi
    type Creator interface {
    	FactoryMethod() Product
    	SomeOperation() string
    }
    
    // Əsas yaradıcı strukturu
    type BaseCreator struct{}
    
    func (bc *BaseCreator) SomeOperation() string {
    	product := bc.FactoryMethod()
    	result := "Yaradıcı: Eyni kod yalnızca " + product.Operation() + " ilə işləyib"
    	return result
    }
    
    // Konkret yaradıcı A
    type ConcreteCreator1 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator1) FactoryMethod() Product {
    	return &ConcreteProduct1{} // Konkret məhsul A yaradılır
    }
    
    // Konkret yaradıcı B
    type ConcreteCreator2 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator2) FactoryMethod() Product {
    	return &ConcreteProduct2{} // Konkret məhsul B yaradılır
    }
    
    func main() {
    	creator1 := &ConcreteCreator1{}
    	fmt.Println(creator1.SomeOperation())
    
    	creator2 := &ConcreteCreator2{}
    	fmt.Println(creator2.SomeOperation())
    }
    
  • Mücərrəd Fabrika (Abstract Factory): Əlaqəli və ya asılı obyekt ailələrini yaratmaq üçün interfeys təmin edir, onların konkret siniflərini göstərmədən.

    package main
    
    import "fmt"
    
    // Məhsul A interfeysi
    type AbstractProductA interface {
    	UseProductA() string
    }
    
    // Konkret məhsul A1
    type ConcreteProductA1 struct{}
    
    func (*ConcreteProductA1) UseProductA() string {
    	return "A məhsulunun nəticəsi."
    }
    
    // Konkret məhsul A2
    type ConcreteProductA2 struct{}
    
    func (*ConcreteProductA2) UseProductA() string {
    	return "A məhsulunun nəticəsi."
    }
    
    // Məhsul B interfeysi
    type AbstractProductB interface {
    	UseProductB() string
    	AnotherFunctionB(collaborator AbstractProductA) string // A məhsulu ilə qarşılıqlı əlaqə
    }
    
    // Konkret məhsul B1
    type ConcreteProductB1 struct{}
    
    func (*ConcreteProductB1) UseProductB() string {
    	return "B məhsulunun nəticəsi."
    }
    
    func (*ConcreteProductB1) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("B1 məhsulunun (%s) ilə əməkdaşlıq nəticəsi", result)
    }
    
    // Konkret məhsul B2
    type ConcreteProductB2 struct{}
    
    func (*ConcreteProductB2) UseProductB() string {
    	return "B məhsulunun nəticəsi."
    }
    
    func (*ConcreteProductB2) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("B2 məhsulunun (%s) ilə əməkdaşlıq nəticəsi", result)
    }
    
    // Mücərrəd fabrikanın interfeysi
    type AbstractFactory interface {
    	CreateProductA() AbstractProductA
    	CreateProductB() AbstractProductB
    }
    
    // Konkret fabrikanın 1
    type ConcreteFactory1 struct{}
    
    func (*ConcreteFactory1) CreateProductA() AbstractProductA {
    	return &ConcreteProductA1{}
    }
    
    func (*ConcreteFactory1) CreateProductB() AbstractProductB {
    	return &ConcreteProductB1{}
    }
    
    // Konkret fabrikanın 2
    type ConcreteFactory2 struct{}
    
    func (*ConcreteFactory2) CreateProductA() AbstractProductA {
    	return &ConcreteProductA2{}
    }
    
    func (*ConcreteFactory2) CreateProductB() AbstractProductB {
    	return &ConcreteProductB2{}
    }
    
    // Müştəri kodu, fabrikanın istifadəsi
    func ClientCode(factory AbstractFactory) {
    	productA := factory.CreateProductA()
    	productB := factory.CreateProductB()
    
    	fmt.Println(productB.UseProductB())
    	fmt.Println(productB.AnotherFunctionB(productA))
    }
    
    func main() {
    	fmt.Println("Müştəri: Birinci fabrikanı sınaqdan keçirir:")
    	ClientCode(&ConcreteFactory1{})
    
    	fmt.Println("Müştəri: Eyni müştəri kodunu ikinci fabrikanı sınaqdan keçirir:")
    	ClientCode(&ConcreteFactory2{})
    }
    

Fabrika Metodu və Mücərrəd Fabrika arasındakı əsas fərq: Fabrika Metodu tək məhsulları yaradır, Mücərrəd Fabrika isə məhsul ailələrini.

Nümunə adı Təsviri Nə zaman istifadə etmək olar
Sadə Fabrika Bir sinifdə müxtəlif növ obyektlərin yaradılması üçün metod. Sadə obyektlərin yaradılması üçün, fabriklərin hierarxiyasına ehtiyac olmadan.
Fabrika Metodu Obyektin yaradılması üçün interfeys, altklaslar hansı sinfi instansiya edəcəyinə qərar verir. Sinif hansı obyekt növünü yaradacağını əvvəlcədən bilmədikdə.
Mücərrəd Fabrika Əlaqəli obyekt ailələrini yaratmaq üçün interfeys təmin edir. Sistem yaradılma və təqdimat üsulundan asılı olmamalıdır.

Fabrika nümunəsi kodun zəif əlaqəliliyinə kömək edir və yeni məhsul növlərinin əlavə edilməsini asanlaşdırır, müştəri kodunu dəyişmədən.