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

工厂方法模式

工厂方法模式是一种创建型设计模式,其核心思想是定义一个用于创建对象的接口,但让实现这个接口的子类来决定实例化哪一个类。工厂方法把一个类的实例化推迟到其子类。

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

  • 抽象工厂(Abstract Factory)角色:定义创建产品对象的接口,但不实现该接口。
  • 具体工厂(Concrete Factory)角色:实现抽象工厂中的接口方法,生成具体的产品实例。
  • 抽象产品(Abstract Product)角色:定义了产品的接口,产品对象的共同父类或共同拥有的接口。
  • 具体产品(Concrete Product)角色:实现了抽象产品角色所定义的接口,由具体工厂实例化。

工厂方法模式的实现

工厂方法模式通过面向抽象层开发,使得业务逻辑层与具体产品的创建解耦,遵循了面向抽象层接口编程的原则。

Go示例

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

package main

import "fmt"

// 抽象产品:形状接口
type Shape interface {
    Draw() string
}

// 具体产品:圆形
type Circle struct{}

func (c Circle) Draw() string {
    return "Inside Circle::draw() method."
}

// 具体产品:正方形
type Square struct{}

func (s Square) Draw() string {
    return "Inside Square::draw() method."
}

// 抽象工厂:形状工厂接口
type ShapeFactory interface {
    CreateShape() Shape
}

// 具体工厂:圆形工厂
type CircleFactory struct{}

func (c CircleFactory) CreateShape() Shape {
    return Circle{}
}

// 具体工厂:正方形工厂
type SquareFactory struct{}

func (s SquareFactory) CreateShape() Shape {
    return Square{}
}

func main() {
    // 创建圆形工厂和正方形工厂
    circleFactory := CircleFactory{}
    squareFactory := SquareFactory{}

    // 使用圆形工厂创建圆形并绘制
    shape1 := circleFactory.CreateShape()
    fmt.Println(shape1.Draw())

    // 使用正方形工厂创建正方形并绘制
    shape2 := squareFactory.CreateShape()
    fmt.Println(shape2.Draw())
}

在上面的示例中,我们定义了一个Shape接口,它有一个Draw方法。然后我们创建了两个具体产品CircleSquare,它们都实现了Shape接口。ShapeFactory是形状工厂接口,它有一个方法CreateShape,用于创建形状实例。CircleFactorySquareFactory是具体工厂,它们分别实现了CreateShape方法,用于创建圆形和正方形实例。在main函数中,我们通过工厂创建了不同类型的形状,并调用它们的Draw方法。

这个示例展示了如何使用工厂方法模式来分离对象的创建和使用,使得代码更加模块化和易于维护。同时,它也展示了如何通过工厂方法模式来遵循开闭原则,即在不修改现有代码的情况下,扩展新的产品类型。

打 赏