Golang设计模式之抽象工厂方法

抽象工厂方法模式

抽象工厂方法模式是一种创建型设计模式,它提供了一种方式,用于创建一系列相关或相互依赖的对象,而不需要指定它们具体的类。这种模式通过定义一个创建对象的接口,允许客户端使用这个接口来创建各种产品,而不需要知道具体的类。

产品族与产品等级结构

  • 产品族:具有相同特点或功能,但来自不同地区、厂商、开发包或组织模块的产品集合。
  • 产品等级结构:具有相同特点或功能,但来自不同地区、厂商、开发包或组织模块的产品集合。

抽象工厂方法模式中的角色和职责

  • 抽象工厂(Abstract Factory)角色:声明了一组用于创建一族产品的方法,每一个方法对应一种产品。
  • 具体工厂(Concrete Factory)角色:实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品,这些产品构成了一个产品族。
  • 抽象产品(Abstract Product)角色:为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
  • 具体产品(Concrete Product)角色:定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

Go示例

下面是一个使用Go语言实现的抽象工厂方法模式示例,我们将创建一个家具工厂,用于生产不同类型的家具。

package main

import "fmt"

// 抽象产品:家具接口
type Furniture interface {
    Describe() string
}

// 具体产品:椅子
type Chair struct{}

func (c Chair) Describe() string {
    return "This is a chair."
}

// 具体产品:桌子
type Table struct{}

func (t Table) Describe() string {
    return "This is a table."
}

// 具体产品:沙发
type Sofa struct{}

func (s Sofa) Describe() string {
    return "This is a sofa."
}

// 抽象工厂:家具工厂接口
type FurnitureFactory interface {
    CreateChair() Furniture
    CreateTable() Furniture
    CreateSofa() Furniture
}

// 具体工厂:现代家具工厂
type ModernFurnitureFactory struct{}

func (m ModernFurnitureFactory) CreateChair() Furniture {
    return Chair{}
}

func (m ModernFurnitureFactory) CreateTable() Furniture {
    return Table{}
}

func (m ModernFurnitureFactory) CreateSofa() Furniture {
    return Sofa{}
}

// 具体工厂:古典家具工厂
type ClassicFurnitureFactory struct{}

func (c ClassicFurnitureFactory) CreateChair() Furniture {
    return Chair{} // 可以替换为古典椅子
}

func (c ClassicFurnitureFactory) CreateTable() Furniture {
    return Table{} // 可以替换为古典桌子
}

func (c ClassicFurnitureFactory) CreateSofa() Furniture {
    return Sofa{} // 可以替换为古典沙发
}

func main() {
    // 创建现代家具工厂
    modernFactory := ModernFurnitureFactory{}
    modernChair := modernFactory.CreateChair()
    modernTable := modernFactory.CreateTable()
    modernSofa := modernFactory.CreateSofa()

    fmt.Println(modernChair.Describe())
    fmt.Println(modernTable.Describe())
    fmt.Println(modernSofa.Describe())

    // 创建古典家具工厂
    classicFactory := ClassicFurnitureFactory{}
    classicChair := classicFactory.CreateChair()
    classicTable := classicFactory.CreateTable()
    classicSofa := classicFactory.CreateSofa()

    fmt.Println(classicChair.Describe())
    fmt.Println(classicTable.Describe())
    fmt.Println(classicSofa.Describe())
}

代码说明

在这个示例中,我们定义了一个Furniture接口,它有一个Describe方法。然后我们创建了三个具体产品:ChairTableSofa,它们都实现了Furniture接口。FurnitureFactory是家具工厂接口,它有三个方法CreateChairCreateTableCreateSofa,用于创建不同类型的家具实例。

ModernFurnitureFactoryClassicFurnitureFactory是具体工厂,它们分别实现了FurnitureFactory接口,用于创建现代和古典风格的家具。在main函数中,我们通过工厂创建了不同风格的家具,并调用它们的Describe方法。

打 赏