Sobes.tech
Middle

Μίλησε για το μοτίβο Factory.

sobes.tech AI

Απάντηση από AI

Η εργοστάσιο είναι ένα πρότυπο δημιουργικού σχεδιασμού που παρέχει ένα κοινό διεπαφή για τη δημιουργία αντικειμένων στην υπερκλάση, ενώ οι υποκλάσεις μπορούν να αλλάξουν τον τύπο των δημιουργούμενων αντικειμένων.

  • Απλή εργοστάσιο (Simple Factory): Δεν είναι ένα καθαρό πρότυπο, περισσότερο μια ιδιωματική. Μια κλάση με μια μέθοδο που δημιουργεί αντικείμενα βάσει των εισόδων.

    package main
    
    import "fmt"
    
    type Product interface {
    	Use()
    }
    
    type ConcreteProductA struct{}
    
    func (p *ConcreteProductA) Use() {
    	fmt.Println("Χρήση του Concrete Product A")
    }
    
    type ConcreteProductB struct{}
    
    func (p *ConcreteProductB) Use() {
    	fmt.Println("Χρήση του Concrete Product B")
    }
    
    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()
    }
    
  • Μέθοδος εργοστασίου (Factory Method): Ορίζει το διεπαφή για τη δημιουργία ενός αντικειμένου, αλλά επιτρέπει στις υποκλάσεις να αποφασίζουν ποια κλάση να δημιουργήσουν.

    package main
    
    import "fmt"
    
    // Διεπαφή προϊόντος
    type Product interface {
    	Operation() string
    }
    
    // Συγκεκριμένο προϊόν A
    type ConcreteProduct1 struct{}
    
    func (p *ConcreteProduct1) Operation() string {
    	return "Αποτέλεσμα του ConcreteProduct1"
    }
    
    // Συγκεκριμένο προϊόν B
    type ConcreteProduct2 struct{}
    
    func (p *ConcreteProduct2) Operation() string {
    	return "Αποτέλεσμα του ConcreteProduct2"
    }
    
    // Διεπαφή δημιουργού
    type Creator interface {
    	FactoryMethod() Product
    	SomeOperation() string
    }
    
    // Βασική δομή δημιουργού
    type BaseCreator struct{}
    
    func (bc *BaseCreator) SomeOperation() string {
    	// Κλήση της μεθόδου εργοστασίου για λήψη αντικειμένου προϊόντος
    	product := bc.FactoryMethod()
    	// Χρήση του προϊόντος
    	result := "Ο δημιουργός: Ο ίδιος κώδικας του δημιουργού μόλις λειτούργησε με " + product.Operation()
    	return result
    }
    
    // Συγκεκριμένος δημιουργός A
    type ConcreteCreator1 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator1) FactoryMethod() Product {
    	return &ConcreteProduct1{} // Δημιουργεί το συγκεκριμένο προϊόν A
    }
    
    // Συγκεκριμένος δημιουργός B
    type ConcreteCreator2 struct {
    	BaseCreator
    }
    
    func (cc *ConcreteCreator2) FactoryMethod() Product {
    	return &ConcreteProduct2{} // Δημιουργεί το συγκεκριμένο προϊόν B
    }
    
    func main() {
    	// Παράδειγμα χρήσης
    	creator1 := &ConcreteCreator1{}
    	fmt.Println(creator1.SomeOperation())
    
    	creator2 := &ConcreteCreator2{}
    	fmt.Println(creator2.SomeOperation())
    }
    
  • Μακρινή εργοστάσιο (Abstract Factory): Παρέχει διεπαφή για τη δημιουργία οικογενειών σχετικών ή εξαρτώμενων αντικειμένων χωρίς να καθορίζει τις συγκεκριμένες τους κλάσεις.

    package main
    
    import "fmt"
    
    // Διεπαφή προϊόντος A
    type AbstractProductA interface {
    	UseProductA() string
    }
    
    // Συγκεκριμένο προϊόν A1
    type ConcreteProductA1 struct{}
    
    func (*ConcreteProductA1) UseProductA() string {
    	return "Το αποτέλεσμα του προϊόντος A1."
    }
    
    // Συγκεκριμένο προϊόν A2
    type ConcreteProductA2 struct{}
    
    func (*ConcreteProductA2) UseProductA() string {
    	return "Το αποτέλεσμα του προϊόντος A2."
    }
    
    // Διεπαφή προϊόντος B
    type AbstractProductB interface {
    	UseProductB() string
    	AnotherFunctionB(collaborator AbstractProductA) string // Αλληλεπίδραση με το προϊόν A
    }
    
    // Συγκεκριμένο προϊόν B1
    type ConcreteProductB1 struct{}
    
    func (*ConcreteProductB1) UseProductB() string {
    	return "Το αποτέλεσμα του προϊόντος B1."
    }
    
    func (*ConcreteProductB1) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("Το αποτέλεσμα του B1 συνεργάζεται με το (%s)", result)
    }
    
    // Συγκεκριμένο προϊόν B2
    type ConcreteProductB2 struct{}
    
    func (*ConcreteProductB2) UseProductB() string {
    	return "Το αποτέλεσμα του προϊόντος B2."
    }
    
    func (*ConcreteProductB2) AnotherFunctionB(collaborator AbstractProductA) string {
    	result := collaborator.UseProductA()
    	return fmt.Sprintf("Το αποτέλεσμα του B2 συνεργάζεται με το (%s)", result)
    }
    
    // Διεπαφή μίας οικογένειας προϊόντων
    type AbstractFactory interface {
    	CreateProductA() AbstractProductA
    	CreateProductB() AbstractProductB
    }
    
    // Συγκεκριμένη οικογένεια 1
    type ConcreteFactory1 struct{}
    
    func (*ConcreteFactory1) CreateProductA() AbstractProductA {
    	return &ConcreteProductA1{}
    }
    
    func (*ConcreteFactory1) CreateProductB() AbstractProductB {
    	return &ConcreteProductB1{}
    }
    
    // Συγκεκριμένη οικογένεια 2
    type ConcreteFactory2 struct{}
    
    func (*ConcreteFactory2) CreateProductA() AbstractProductA {
    	return &ConcreteProductA2{}
    }
    
    func (*ConcreteFactory2) CreateProductB() AbstractProductB {
    	return &ConcreteProductB2{}
    }
    
    // Κώδικας πελάτη που λειτουργεί με τη фабική μέθοδο
    func ClientCode(factory AbstractFactory) {
    	productA := factory.CreateProductA()
    	productB := factory.CreateProductB()
    
    	fmt.Println(productB.UseProductB())
    	fmt.Println(productB.AnotherFunctionB(productA))
    }
    
    func main() {
    	fmt.Println("Πελάτης: Δοκιμή κώδικα πελάτη με τον πρώτο τύπο εργοστασίου:")
    	ClientCode(&ConcreteFactory1{})
    
    	fmt.Println("Πελάτης: Δοκιμή του ίδιου κώδικα πελάτη με τον δεύτερο τύπο εργοστασίου:")
    	ClientCode(&ConcreteFactory2{})
    }
    

Ο βασικός διαχωρισμός μεταξύ της Μεθόδου Εργοστασίου και της Μητρικής Εργοστασίου: Η Μέθοδος Εργοστασίου δημιουργεί μεμονωμένα προϊόντα, ενώ η Μητρική Εργοστασίου δημιουργεί οικογένειες προϊόντων.

Όνομα προτύπου Περιγραφή Πότε να το χρησιμοποιήσετε
Απλή εργοστάσιο Μέθοδος σε μια κλάση για τη δημιουργία διαφορετικών τύπων αντικειμένων. Για απλή δημιουργία αντικειμένων χωρίς ανάγκη ιεραρχίας εργοστασίων.
Μέθοδος Εργοστασίου Διεπαφή για τη δημιουργία αντικειμένου, επιτρέπει στις υποκλάσεις να αποφασίζουν ποια κλάση να δημιουργήσουν. Όταν η κλάση δεν μπορεί να προβλέψει τον τύπο των αντικειμένων που πρέπει να δημιουργήσει.
Μητρική Εργοστάσιο Παρέχει διεπαφή για τη δημιουργία σχετικών ή εξαρτώμενων οικογενειών αντικειμένων χωρίς να καθορίζει τις συγκεκριμένες τους κλάσεις. Όταν το σύστημα πρέπει να είναι ανεξάρτητο από τον τρόπο δημιουργίας και παρουσίασης των προϊόντων του.

Το πρότυπο εργοστασίου προάγει τον χαλαρό δεσμό του κώδικα και διευκολύνει την προσθήκη νέων τύπων προϊόντων χωρίς αλλαγή στον κώδικα πελάτη.