Μίλησε για το μοτίβο 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{}) }
Ο βασικός διαχωρισμός μεταξύ της Μεθόδου Εργοστασίου και της Μητρικής Εργοστασίου: Η Μέθοδος Εργοστασίου δημιουργεί μεμονωμένα προϊόντα, ενώ η Μητρική Εργοστασίου δημιουργεί οικογένειες προϊόντων.
| Όνομα προτύπου | Περιγραφή | Πότε να το χρησιμοποιήσετε |
|---|---|---|
| Απλή εργοστάσιο | Μέθοδος σε μια κλάση για τη δημιουργία διαφορετικών τύπων αντικειμένων. | Για απλή δημιουργία αντικειμένων χωρίς ανάγκη ιεραρχίας εργοστασίων. |
| Μέθοδος Εργοστασίου | Διεπαφή για τη δημιουργία αντικειμένου, επιτρέπει στις υποκλάσεις να αποφασίζουν ποια κλάση να δημιουργήσουν. | Όταν η κλάση δεν μπορεί να προβλέψει τον τύπο των αντικειμένων που πρέπει να δημιουργήσει. |
| Μητρική Εργοστάσιο | Παρέχει διεπαφή για τη δημιουργία σχετικών ή εξαρτώμενων οικογενειών αντικειμένων χωρίς να καθορίζει τις συγκεκριμένες τους κλάσεις. | Όταν το σύστημα πρέπει να είναι ανεξάρτητο από τον τρόπο δημιουργίας και παρουσίασης των προϊόντων του. |
Το πρότυπο εργοστασίου προάγει τον χαλαρό δεσμό του κώδικα και διευκολύνει την προσθήκη νέων τύπων προϊόντων χωρίς αλλαγή στον κώδικα πελάτη.