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

67 阅读3分钟

使用 Golang 实现工厂方法模式

工厂方法模式简介

工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建过程延迟到子类中进行的方式。通过定义一个创建对象的接口,工厂方法模式封装了对象的实例化过程,使得客户端代码只需要关注所需对象的接口而不必关心具体的实现。

特点

  1. 创建对象的接口: 工厂方法模式定义了一个用于创建对象的接口,该接口在具体的子类工厂中被实现。

  2. 封装对象的创建: 客户端代码只需要知道所需对象的接口,而不需要关心具体的实现细节,实现了对象创建和使用的解耦。

  3. 符合开闭原则: 添加新的产品只需要添加对应的具体工厂类和产品类,而无需修改现有代码,符合开闭原则。

优点

  1. 降低耦合度: 工厂方法模式降低了客户端代码与具体类的耦合度,使得系统更加灵活和可维护。

  2. 提高可维护性: 新增产品只需要添加对应的工厂类和产品类,而不需要修改已有代码,提高了系统的可维护性。

  3. 更好的扩展性: 可以轻松地添加新的产品家族,每个产品家族有对应的工厂类,符合开闭原则,扩展性更好。

缺点

  1. 类的数量增多: 随着产品的增加,工厂方法模式会导致类的数量增多,增加了系统复杂性。

  2. 代码冗余: 每个具体产品都需要一个具体工厂类,可能导致大量的类定义,代码冗余。

Golang 实现工厂方法模式

下面是一个使用 Golang 实现工厂方法模式的示例代码:

package main

import "fmt"

// Appliance 表示家电
type Appliance struct {
    name string
}

// IAppliance 定义家电的行为接口
type IAppliance interface {
    Operate()
}

// TV 表示电视
type TV struct {
    Appliance
}

func (t *TV) Operate() {
    fmt.Printf("%s正在播放节目", t.name)
}

// NewTV 创建电视的实例
func NewTV() IAppliance {
    return &TV{
       Appliance{
          name: "电视",
       },
    }
}

// AirConditioner 表示空调
type AirConditioner struct {
    Appliance
}

func (ac *AirConditioner) Operate() {
    fmt.Printf("%s正在调整温度", ac.name)
}

// NewAirConditioner 创建空调的实例
func NewAirConditioner() IAppliance {
    return &AirConditioner{
       Appliance{
          name: "空调",
       },
    }
}

// ApplianceFactory 定义创建家电的工厂接口
type ApplianceFactory interface {
    CreateAppliance() IAppliance
}

// TVFactory 电视的工厂类
type TVFactory struct {
}

func (t *TVFactory) CreateAppliance() IAppliance {
    return NewTV()
}

// NewTVFactory 创建电视的工厂实例
func NewTVFactory() ApplianceFactory {
    return &TVFactory{}
}

// AirConditionerFactory 空调的工厂类
type AirConditionerFactory struct {
}

func (ac *AirConditionerFactory) CreateAppliance() IAppliance {
    return NewAirConditioner()
}

// NewAirConditionerFactory 创建空调的工厂实例
func NewAirConditionerFactory() ApplianceFactory {
    return &AirConditionerFactory{}
}

func main() {
    // 看电视
    tvFactory := NewTVFactory()
    tv := tvFactory.CreateAppliance()
    tv.Operate()
    fmt.Println()
    // 调节空调
    acFactory := NewAirConditionerFactory()
    ac := acFactory.CreateAppliance()
    ac.Operate()
}
电视正在播放节目
空调正在调整温度

通过引入 Appliance 结构体来代表家电的基本属性,同时定义了 IAppliance 接口规范家电的行为。接着,我们实现了具体的电视和空调,即 TVAirConditioner,以及它们的工厂类,分别是 TVFactoryAirConditionerFactory

main 函数中,我们运用工厂方法模式创建了电视和空调的实例,并调用它们的 Operate 方法。这样,整个示例展示了如何利用工厂方法模式来创建不同类型的家电,实现了更灵活的对象创建和降低了客户端代码与具体产品的耦合度。

总结

工厂方法模式为我们提供了一种优雅的方式来创建对象,但随着系统规模的增加,可能引入更多的类和接口。在这种情况下,我们可以考虑抽象工厂模式,它进一步提供了一种组织和管理相关对象家族的手段。

下一篇文章将介绍抽象工厂模式,