Modèles de conception dans Go - Abstract Factory

Bonjour, Habr! Je présente à votre attention la traduction du prochain article "Design Patterns: Abstract Factory Pattern" de Shubham Zanwar.

Une usine abstraite est un modèle de conception générative. Il est utilisé lorsque nous devons créer une famille de produits similaires. Prenons un exemple de chaîne de pizza pour comprendre.

Pizzeria

Disons que vous êtes à la tête d'une entreprise et que vous ouvrez une chaîne de pizzerias dans toute la ville. L'une de vos responsabilités est la production de tous les principaux produits (dans notre cas, les pizzas et le pain à l'ail frit), qui seront représentés par des marques telles que Domino et Roaster (appelons-les ainsi - environ Transl.).

Il existe de nombreuses façons de procéder. Le plus simple est de créer une pizzeria pour chaque marque et une similaire pour le pain frit.

Si vous n'avez toujours aucune idée du fonctionnement des usines, vous pouvez lire ici

Le problème est que nous faisons maintenant confiance à l'utilisateur pour choisir le bon type de pizza et de pain grillé qu'il souhaite. S'ils font l'erreur de faire la pizza Domino's avec le pain à l'ail Frypot, vos clients seront furieux et vous pourriez perdre votre contrat avec ces marques.

, .

( ), . .

, , .

. , :

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")
}

, .

La principale chose à retenir est que le modèle d'usine abstraite implémente une usine d'usine. Des usines internes sont utilisées pour créer le bon type de produits.

Vous pouvez trouver ce code sur github

Tandis que




All Articles