【Golang设计模式】0.简单工厂模式

0. 简单工厂模式

通过传入参数给工厂,让工厂来生成我们想要的实际对象,进而对对象进行一系列操作。

这里想要实现传入动物的类型名称,让工厂来生成我们想要的具体动物。具体操作如下:

在路径factory下新建文件factory.go,包名为factory

package factory

// ...

这里我们定义了动物这种类型animal和给动物设置基本信息的方法SetInfo(name, master string),注意SetInfo()方法是要向外暴露的,所有需要首字母大写。

// 动物
type animal struct {
	name   string
	master string
}

// 给动物设置基本信息
func (a *animal) SetInfo(name, master string) {
	a.name = name
	a.master = master
}

然后定义具体的物种以及实际供外部调用的Speak()方法,要注意的是,Speaker接口中的SetInfo()方法是animal类型中的,由于各个物种都是包含了animal,所以自然也包含了animal类型的方法:

// 具体物种
type dog struct {
	animal
}
type cat struct {
	animal
}
type pig struct {
	animal
}

// 动物都有Speak()方法
type Speaker interface {
	Speak()
	SetInfo(name, master string) // 这里调用的实际上是animal类型的方法
}

func (d dog) Speak() {
	fmt.Printf("我叫[%v], 我的主人是[%v], 汪汪汪~
", d.name, d.master)
}

func (c cat) Speak() {
	fmt.Printf("我叫[%v], [%v]才不是我的主人呢, 明明是我的铲屎官
", c.name, c.master)
}

func (p pig) Speak() {
	fmt.Printf("我叫[%v], 每天都是[%v]给饭我吃, 我吃饱了就想睡觉
", p.name, p.master)
}

最后定义了生产动物的工厂AnimalFactory和获取动物的方法GetAnimal(animalType string) Speaker,工厂和获取动物的方法都是需要向外暴露的,首字母大写。

// 生产动物的工厂
type AnimalFactory struct{}

// 工厂生产动物
func (a AnimalFactory) GetAnimal(animalType string) Speaker {
	var speaker Speaker
	switch animalType {
	case "dog":
		speaker = &dog{}
	case "cat":
		speaker = &cat{}
	case "pig":
		speaker = &pig{}
	}
	return speaker
}

在路径factory的同级目录下新建main.go用于测试方法:

package main

import "github.com/loveshes/go-design-patterns/pattern/factory-pattern/factory"

func main() {
	var af factory.AnimalFactory

	dog := af.GetAnimal("dog")
	dog.SetInfo("小黑", "张三")
	dog.Speak()

	cat := af.GetAnimal("cat")
	cat.SetInfo("喵呜", "marry")
	cat.Speak()

	pig := af.GetAnimal("pig")
	pig.SetInfo("粉红猪小妹", "猪倌")
	pig.Speak()
}

输出为

我叫[小黑], 我的主人是[张三], 汪汪汪~
我叫[喵呜], [marry]才不是我的主人呢, 明明是我的铲屎官
我叫[粉红猪小妹], 每天都是[猪倌]给饭我吃, 我吃饱了就想睡觉

完整示例

原文地址:https://www.cnblogs.com/loveshes/p/12702022.html