使用 Golang 实现抽象工厂模式
抽象工厂模式介绍
抽象工厂模式是一种创建型设计模式,旨在提供一个接口用于创建一系列相关或依赖对象,而无需指定其具体类。
产品等级概念
产品等级是指一组具有相似用途或属于同一类别的产品集合。这些产品在功能和用途上有一定的相似性,但不一定有直接的关联。
在电器设备中,不同品牌的空调(比如 格力、美的)构成一个产品等级。它们都属于空调这个大类别,但品牌之间可能有很多差异。
产品族概念
产品族是指一组在某种维度上相关联的产品集合。这些产品之间通常有一定的关联性,可以一起使用,形成一个完整的解决方案。
在同一品牌的产品等级中,不同类型的电器(比如空调、电视机)构成一个产品族。它们之间存在关联性,属于同一品牌的整体产品组合。
需求
当用户需要的家电必须是同一品牌,不想是格力电视和美的空调;并且当你需要在添加新的品牌、新的家电时,不想修改已有代码时,符合开闭原则,可通过抽象工厂模式实现。
特点
抽象工厂模式具有以下特点:
- 产品族一致性: 抽象工厂模式确保创建的产品属于同一产品族,即产品之间有一定的关联性。这有助于确保产品的一致性,使它们能够协同工作。
- 工厂切换灵活性: 通过使用抽象工厂模式,客户端代码可以轻松地切换不同的工厂,以便创建不同产品族的对象。这使得系统更加灵活,能够适应不同的需求和变化。
- 系统扩展性: 当需要引入新的产品族时,只需添加新的具体工厂和产品类,而无需修改已有的代码。这有助于系统的扩展,同时保持对已有功能的稳定性。
- 符合开闭原则: 抽象工厂模式符合开闭原则,即对扩展开放,对修改关闭。通过添加新的具体工厂和产品,可以扩展系统的功能,而不会影响到已有的代码。
- 降低客户端与产品类的耦合度: 客户端代码通过抽象工厂接口与具体产品类解耦,客户端不需要知道具体产品的实现细节,只需关心抽象工厂接口和产品的一致性。
- 适用于复杂对象构建: 抽象工厂模式适用于需要构建一整个产品族,且这些产品族之间存在关联性的场景。它能够提供一种有组织的方式来创建和管理相关对象。
代码示例说明
以下是一个简单的 Golang 代码示例,以上述的家电为例子,演示了抽象工厂模式:
go
package main
import "fmt"
// Appliance 表示家电的基本属性
type Appliance struct {
brand string
}
// IAppliance 定义家电的行为接口
type IAppliance interface {
Operate()
}
// TV 表示电视
type TV struct {
Appliance
}
func (t *TV) Operate() {
fmt.Printf("%s电视正在播放节目\n", t.brand)
}
// AirConditioner 表示空调
type AirConditioner struct {
Appliance
}
func (ac *AirConditioner) Operate() {
fmt.Printf("%s空调正在调整温度\n", ac.brand)
}
// AbstractFactory 定义创建家电的抽象工厂接口
type AbstractFactory interface {
CreateTV() IAppliance
CreateAirConditioner() IAppliance
}
// GreeFactory 格力品牌的家电工厂
type GreeFactory struct {
}
func (gf *GreeFactory) CreateTV() IAppliance {
return &TV{Appliance: Appliance{brand: "格力"}}
}
func (gf *GreeFactory) CreateAirConditioner() IAppliance {
return &AirConditioner{Appliance: Appliance{brand: "格力"}}
}
// MideaFactory 美的品牌的家电工厂
type MideaFactory struct {
}
func (mf *MideaFactory) CreateTV() IAppliance {
return &TV{Appliance: Appliance{brand: "美的"}}
}
func (mf *MideaFactory) CreateAirConditioner() IAppliance {
return &AirConditioner{Appliance: Appliance{brand: "美的"}}
}
func main() {
// 使用格力工厂创建格力家电
greeFactory := &GreeFactory{}
greeTV := greeFactory.CreateTV()
greeAC := greeFactory.CreateAirConditioner()
greeTV.Operate()
greeAC.Operate()
fmt.Println()
// 使用美的工厂创建美的家电
mideaFactory := &MideaFactory{}
mideaTV := mideaFactory.CreateTV()
mideaAC := mideaFactory.CreateAirConditioner()
mideaTV.Operate()
mideaAC.Operate()
}
Appliance
结构体表示家电的基本属性,包括品牌。TV
和 AirConditioner
是具体产品,实现了 IAppliance
接口。AbstractFactory
定义了创建家电的抽象工厂接口,包括创建电视和空调的方法。GreeFactory
和 MideaFactory
分别是格力和美的品牌的具体工厂,实现了抽象工厂接口。在 main
函数中,我们使用不同的工厂创建格力和美的家电,并调用它们的 Operate
方法。