Go中的设计模式-抽象工厂

哈Ha!我向您介绍下一篇 Shubham Zanwar撰写的文章“设计模式:抽象工厂模式”的翻译。

抽象工厂是一种生成设计模式。当我们需要创建一系列类似产品时使用它。让我们以比萨连锁店为例进行了解。

比萨店

假设您是一家企业的负责人,并且在整个城市开设了一家比萨连锁店。您的职责之一是生产所有主要产品(在我们的示例中是比萨饼和炸蒜蓉面包),将由Domino和Roaster等品牌代表。

有很多方法可以做到这一点。最简单的方法是为每个品牌创建一个比萨工厂,并为炸面包创建一个类似的工厂。

如果您仍然不知道工厂如何运作,可以在这里阅读

问题是我们现在相信用户可以选择他们想要的正确类型的比萨饼和烤面包。如果他们犯了用Frypot的蒜蓉面包制作多米诺比萨饼的错误,您的客户将会大怒,您可能会失去与这些品牌的合同。

别担心,有一种简单的方法。

您可以为每个品牌创建工厂,而不必为每个产品(比萨饼或炸面包)创建工厂。两家工厂都将生产比萨饼和炸面包。

开了一家比萨店后,您可以给经理多米诺工厂或火盆店老板,您可以休息了,因为现在没有人会混淆任何事情。

让我们看一下代码。在编写工厂之前,让我们自己创建产品:

普通披萨

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
}

现在我们的品牌:具有统一功能的火盆工厂和Domino工厂

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

, .

要记住的主要事情是抽象工厂模式实现了工厂工厂。内部工厂用于制造正确的产品。

您可以在github上找到此代码




All Articles