Hallo Habr! Ich präsentiere Ihnen die Übersetzung des nächsten Artikels "Design Patterns: Abstract Factory Pattern" von Shubham Zanwar.
Eine abstrakte Fabrik ist ein generatives Entwurfsmuster. Es wird verwendet, wenn wir eine Familie ähnlicher Produkte erstellen müssen. Nehmen wir zum Verständnis ein Beispiel einer Pizzakette.
Pizzeria
Nehmen wir an, Sie sind der Leiter eines Unternehmens und eröffnen eine Kette von Pizzerien in der ganzen Stadt. Eine Ihrer Aufgaben ist die Herstellung aller Hauptprodukte (in unserem Fall Pizza und gebratenes Knoblauchbrot), die von Marken wie Domino und Roaster vertreten werden.
Es gibt viele Möglichkeiten, dies zu tun. Am einfachsten ist es, für jede Marke eine Pizzafabrik und für gebratenes Brot eine ähnliche zu erstellen.
Wenn Sie noch keine Ahnung haben, wie Fabriken funktionieren, können Sie hier lesen
Das Problem ist, dass wir dem Benutzer jetzt vertrauen, dass er die richtige Art von Pizza und geröstetem Brot auswählt. Wenn sie den Fehler machen, Domino's Pizza mit Roaster's Knoblauchbrot zuzubereiten, sind Ihre Kunden wütend und Sie könnten Ihren Vertrag mit diesen Marken verlieren.
, .
( ), . .
, , .
. , :
type iPizza interface {
GetPrice() float64
GetName() string
GetToppings() []string
}
type pizza struct {
name string
price float64
toppings []string
}
func (p *pizza) GetName() string {
return p.name
}
func (p *pizza) GetPrice() float64 {
return p.price
}
func (p *pizza) GetToppings() []string {
return p.toppings
}
type pizzaHutPizza struct {
pizza
}
type dominosPizza struct {
pizza
}
type iGarlicBread interface {
GetPrice() float64
GetName() string
}
type garlicBread struct {
name string
price float64
}
func (g *garlicBread) GetName() string {
return g.name
}
func (g *garlicBread) GetPrice() float64 {
return g.price
}
type pizzaHutGarlicBread struct {
garlicBread
}
type dominosGarlicBread struct {
garlicBread
}, , . .
,
type iPizzaFactory interface {
createPizza() iPizza
createGarlicBread() iGarlicBread
}: - -
type PizzaHutFactory struct {}
func (p *PizzaHutFactory) createPizza(): iPizza {
return &pizzaHutPizza{
pizza{
name: "pepperoni",
price: 230.3,
toppings: []string{"olives", "mozzarella", "pork"},
},
}
}
func (p *pizzaHutFactory) createGarlicBread() iGarlicBread {
return &pizzaHutGarlicBread{
garlicBread{
name: "garlic bread",
price: 180.99,
},
}
}type dominosFactory struct{}
func (d *dominosFactory) createPizza() iPizza {
return &dominosPizza{
pizza{
name: "margherita",
price: 200.5,
toppings: []string{"tomatoes", "basil", "olive oil"},
},
}
}
func (d *dominosFactory) createGarlicBread() iGarlicBread {
return &dominosGarlicBread{
garlicBread{
name: "cheesy bread sticks",
price: 150.00,
},
}
}, /.
. , . ? .
. , ( ), ( ). "", .
-
func getPizzaFactory(chain string) (iPizzaFactory, error) {
if chain == "P" {
return &pizzaHutFactory{}, nil
}
if chain == "D" {
return &dominosFactory{}, nil
}
return nil, fmt.Errorf("Enter a valid chain type next time")
}, .
Das Wichtigste ist, dass das abstrakte Fabrikmuster eine Fabrikfabrik implementiert. In internen Fabriken werden Produkte des gewünschten Typs hergestellt.
Sie finden diesen Code auf github
Tschüss