发布日期

GoLang 设计模式之抽象工厂模式 (Abstract Factory)

软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设 计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。

🔨 抽象工厂模式(Abstract Factory)

抽象工厂模式提供了一种封装一组具有共同主题但没有指定其具体类的单个工厂的方法。简单来说; 将个人但相关/依赖工厂分组在一起而不指定其具体类别的工厂。现实世界的例子:你可能需要一个有不同种类特色的家伙来安装门,例如木门木匠,铁门焊机等。你可以看到门之间存在依赖关系,木门需要木匠,铁门需要焊工等

代码实现 (源码


package examples

// door 接口
type door interface {
    // GetDescription 获取描述信息
    GetDescription() string
}

// WoodenDoor 木门
type WoodenDoor struct {
}

// GetDescription 木门的描述
func (woodenDoor *WoodenDoor) GetDescription() string {
    return "我是木门!"
}

// IronDoor 铁门
type IronDoor struct {
}

// GetDescription 铁门的描述
func (ironDoor *IronDoor) GetDescription() string {
    return "我是铁门!"
}

// doorFittingExpert 接口(装门的人)
type doorFittingExpert interface {
    // GetDescription 获取描述信息
    GetDescription() string
}

// Welder 装铁门的人
type Welder struct {
}

// GetDescription 装铁门的人的描述
func (welder *Welder) GetDescription() string {
    return "我是装铁门的人!"
}

// Carpenter 装木门的人
type Carpenter struct {
}

// GetDescription 装木门的人的描述
func (carpenter *Carpenter) GetDescription() string {
    return "我是装木门的人!"
}

// doorFactory 现在我们有抽象工厂,让我们制作相关对象的工厂,即木门工厂将创建一个木门和木匠,铁门工厂将创建一个铁门和铁匠
type doorFactory interface {
    // MakeDoor 创建门
    MakeDoor()
    // MakeFittingExpert 选择工匠
    MakeFittingExpert()
}

// WoodenDoorFactory 木门工厂
type WoodenDoorFactory struct {
}

// MakeDoor 创建木门
func (woodenDoorFactory *WoodenDoorFactory) MakeDoor() *WoodenDoor {
    return &WoodenDoor{}
}

// MakeFittingExpert 选择木匠
func (woodenDoorFactory *WoodenDoorFactory) MakeFittingExpert() *Carpenter {
    return &Carpenter{}
}

// IronDoorFactory 铁门工厂
type IronDoorFactory struct {
}

// MakeDoor 创建铁门
func (ironDoorFactory *IronDoorFactory) MakeDoor() *IronDoor {
    return &IronDoor{}
}

// MakeFittingExpert 选择木匠
func (ironDoorFactory *IronDoorFactory) MakeFittingExpert() *Welder {
    return &Welder{}
}

测试用例(源码

package examples

import "testing"

// command: go test -v abstract_factory_test.go abstract_factory.go
func TestAbstractFactory(t *testing.T) {
    // 木门工厂
    woodenDoorFactory := &WoodenDoorFactory{}
    // 木门的描述
    if str := woodenDoorFactory.MakeDoor().GetDescription(); str != "我是木门!" {
        t.Fail()
    }
    // 木匠的描述
    if str := woodenDoorFactory.MakeFittingExpert().GetDescription(); str != "我是装木门的人!" {
        t.Fail()
    }

    // 铁门工厂
    ironDoorFactory := &IronDoorFactory{}
    // 铁门的描述
    if str := ironDoorFactory.MakeDoor().GetDescription(); str != "我是铁门!" {
        t.Fail()
    }
    // 铁匠的描述
    if str := ironDoorFactory.MakeFittingExpert().GetDescription(); str != "我是装铁门的人!" {
        t.Fail()
    }
}

注意

  • 设计模式不是解决所有问题的灵丹妙药。

  • 不要试图强迫他们; 如果这样做的话,应该发生坏事。

  • 请记住,设计模式是问题的解决方案,而不是解决问题的解决方案;所以不要过分思考。

  • 如果以正确的方式在正确的地方使用,他们可以证明是救世主; 否则他们可能会导致代码混乱。

声明

备案号:湘ICP备2020019075号 © 2020 yxx All rights reserved. | my github