使用 Golang 实现工厂方法模式
工厂方法模式简介
工厂方法模式是一种创建型设计模式,它提供了一种将对象的创建过程延迟到子类中进行的方式。通过定义一个创建对象的接口,工厂方法模式封装了对象的实例化过程,使得客户端代码只需要关注所需对象的接口而不必关心具体的实现。
特点
-
创建对象的接口: 工厂方法模式定义了一个用于创建对象的接口,该接口在具体的子类工厂中被实现。
-
封装对象的创建: 客户端代码只需要知道所需对象的接口,而不需要关心具体的实现细节,实现了对象创建和使用的解耦。
-
符合开闭原则: 添加新的产品只需要添加对应的具体工厂类和产品类,而无需修改现有代码,符合开闭原则。
优点
-
降低耦合度: 工厂方法模式降低了客户端代码与具体类的耦合度,使得系统更加灵活和可维护。
-
提高可维护性: 新增产品只需要添加对应的工厂类和产品类,而不需要修改已有代码,提高了系统的可维护性。
-
更好的扩展性: 可以轻松地添加新的产品家族,每个产品家族有对应的工厂类,符合开闭原则,扩展性更好。
缺点
-
类的数量增多: 随着产品的增加,工厂方法模式会导致类的数量增多,增加了系统复杂性。
-
代码冗余: 每个具体产品都需要一个具体工厂类,可能导致大量的类定义,代码冗余。
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 接口规范家电的行为。接着,我们实现了具体的电视和空调,即 TV、AirConditioner,以及它们的工厂类,分别是 TVFactory 和 AirConditionerFactory。
在 main 函数中,我们运用工厂方法模式创建了电视和空调的实例,并调用它们的 Operate 方法。这样,整个示例展示了如何利用工厂方法模式来创建不同类型的家电,实现了更灵活的对象创建和降低了客户端代码与具体产品的耦合度。
总结
工厂方法模式为我们提供了一种优雅的方式来创建对象,但随着系统规模的增加,可能引入更多的类和接口。在这种情况下,我们可以考虑抽象工厂模式,它进一步提供了一种组织和管理相关对象家族的手段。
下一篇文章将介绍抽象工厂模式,