Golang与设计模式-Abstract Factory抽象工厂模式

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) 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值