Abstract Factory抽象工厂模式是一种创建型设计模式。抽象工厂模式和 Factory工厂方法模式一样,都符合开闭原则。但是不同的是,工厂方法模式在增加一个具体产品的时候,都要增加对应的工厂。但是抽象工厂模式只有在新增一个类型的具体产品时才需要新增工厂。
场景
本文将以电子工厂生产电子产品为例来演示抽象工厂模式。
我们会定义两种类型的产品手机Phone 和平板电脑 Pad,以及两个不同品牌的生产厂商苹果和华为。
基本类型和接口
首先定义手机接口Phone,以及一个打电话的方法Call()
// 手机接口
type Phone interface {
Call()
}
平板电脑接口Pad,以及一个打游戏方法PlayGame()
// 平板电脑接口
type Pad interface {
PlayGame()
}
接下来定义抽象工厂 -电子厂ElectronicsFactory,以及用来创建不同产品的方法
// 电子工厂接口,生成电子产品,包括 手机、平板等
type ElectronicsFactory interface {
CreatePhone() Phone
CreatePad() Pad
}
实现
先定义苹果工厂的具体实现,以及对应产品Phone和Pad的具体实现
// 苹果工厂,具体工厂
type AppleFactory struct{}
func (f *AppleFactory) CreatePhone() Phone {
return &IPhone{}
}
func (f *AppleFactory) CreatePad() Pad {
return &IPad{}
}
// 苹果手机
type IPhone struct{}
func (p *IPhone) Call() {
fmt.Println("正在使用 IPhone 打电话")
}
// 苹果平板电脑
type IPad struct{}
func (p *IPad) PlayGame() {
fmt.Println("正在使用 IPad 打游戏")
}
接下来是华为工厂和其生产的产品的具体实现
// 华为工厂,具体工厂
type HuaweiFactory struct{}
func (f *HuaweiFactory) CreatePhone() Phone {
return &Mate40{}
}
func (f *HuaweiFactory) CreatePad() Pad {
return &MatePad{}
}
// 华为手机
type Mate40 struct{}
func (p *Mate40) Call() {
fmt.Println("正在使用 Mate40 打电话")
}
// 华为平板电脑
type MatePad struct{}
func (p *MatePad) PlayGame() {
fmt.Println("正在使用 MatePad 打游戏")
}
测试
func main() {
// 苹果工厂
appleFactory := &AppleFactory{}
phone1 := appleFactory.CreatePhone()
phone1.Call()
pad1 := appleFactory.CreatePad()
pad1.PlayGame()
// 华为工厂
huaweiFactory := &HuaweiFactory{}
phone2 := huaweiFactory.CreatePhone()
phone2.Call()
pad2 := huaweiFactory.CreatePad()
pad2.PlayGame()
}
运行结果
结果符合预期。
代码已上传Github:LyonNee/design_patterns_with_go: 基于Golang实现的设计模式代码 (github.com)