Go抽象工厂设计模式

104 阅读2分钟

抽象工厂是一种创建其他工厂的工厂,它可以一起实现一组相关对象的创建。这种设计模式属于创建型模式,提供了一种创建家族工厂的方法,而无需指定它们的具体类别。

使用场景

我们通常会在以下情况下使用抽象工厂设计模式:

  • 当需要生产一组有关联的产品时,例如:苹果电脑需要生产苹果显示器、苹果键盘和苹果鼠标,已达到产品之间的协同工作。
  • 当需要将一组抽象概念实现为一组具有依赖关系的实体组件时。
  • 当需要遵循开闭原则,而需要添加新功能时,只需扩展原始代码以实现新的工厂和产品。

实现

接下来,我们将用一些例子代码来介绍抽象工厂设计模式,让读者可以更好的理解并实现该模式。

1. 定义所有Button、CheckBox类型的接口

type Button interface {
    Paint()
}

type CheckBox interface {
    Paint()
}

2. 创建Button、CheckBox的不同类型实现

type WinButton struct{}

func (b WinButton) Paint() {
    fmt.Println("WinButton")
}

type OSXButton struct{}

func (b OSXButton) Paint() {
    fmt.Println("OSXButton")
}

type WinCheckBox struct{}

func (c WinCheckBox) Paint() {
    fmt.Println("WinCheckBox")
}

type OSXCheckBox struct{}

func (c OSXCheckBox) Paint() {
    fmt.Println("OSXCheckBox")
}

3. 创建不同UI的抽象工厂

type AbstractFactory interface {
    CreateButton() Button
    CreateCheckBox() CheckBox
}

type WinFactory struct{}

func (f WinFactory) CreateButton() Button {
    return WinButton{}
}

func (f WinFactory) CreateCheckBox() CheckBox {
    return WinCheckBox{}
}

type OSXFactory struct{}

func (f OSXFactory) CreateButton() Button {
    return OSXButton{}
}

func (f OSXFactory) CreateCheckBox() CheckBox {
    return OSXCheckBox{}
}

4. 编写代码使用不同UI工厂来创建具体UI元素

func PaintUI(factory AbstractFactory) {
    b := factory.CreateButton()
    c := factory.CreateCheckBox()

    b.Paint()
    c.Paint()
}

func main() {
    PaintUI(WinFactory{})
    PaintUI(OSXFactory{})
}

在这个示例中,我们首先定义了Button和CheckBox接口。然后我们创建了不同类型的Button和CheckBox实现。接下来,我们定义了创建具体UI元素的抽象工厂,并为不同的UI创建了工厂实现。在main函数中,我们使用不同的UI工厂创建UI元素。

总结

通过使用抽象工厂设计模式,我们能够轻松地创建和管理相关的产品系列。这种模式还能够让我们通过增加具体工厂类来扩展原始代码,并且不需要改变其他的代码。

但是,抽象工厂模式在需要增加新的产品族的时候,会比较困难。因为要在所有的具体工厂类中增加对应产品族的生产方法,同时也需要改动抽象工厂接口和所有的具体工厂类,这样就会导致程序规模急速膨胀。