package main
import "fmt"
// 动物都有Speak()方法
type Speaker interface {
Speak()
SetInfo(name, master string) // 这里调用的实际上是animal类型的方法
}
// 动物
type animal struct {
name string
master string
}
// 给动物设置基本信息
func (a *animal) SetInfo(name, master string) {
a.name = name
a.master = master
}
// 具体物种
type dog struct {
animal
}
func (d *dog) Speak() {
fmt.Printf("我叫[%v], 我的主人是[%v], 汪汪汪~\n", d.name, d.master)
}
type cat struct {
animal
}
func (c *cat) Speak() {
fmt.Printf("我叫[%v], [%v]才不是我的主人呢, 明明是我的铲屎官\n", c.name, c.master)
}
type pig struct {
animal
}
func (p *pig) Speak() {
fmt.Printf("我叫[%v], 每天都是[%v]给饭我吃, 我吃饱了就想睡觉\n", p.name, p.master)
}
// 生产动物的工厂
type AnimalFactory struct{}
// 工厂生产动物 简单工厂模式 让工厂来生成我们想要的实际对象,进而对对象进行一系列操作。
func (a AnimalFactory) GetAnimal(animalType string) Speaker {
var speaker Speaker
switch animalType {
case "dog":
speaker = new(dog)
case "cat":
speaker = new(cat)
case "pig":
speaker = new(pig)
}
return speaker
}
func main() {
var af AnimalFactory
var speaker Speaker
fmt.Printf("%T ==== %+v\n", speaker, speaker)
speaker = af.GetAnimal("dog")
speaker.SetInfo("小黑", "张三")
speaker.Speak()
speaker = af.GetAnimal("cat")
speaker.SetInfo("喵呜", "marry")
speaker.Speak()
speaker = af.GetAnimal("pig")
speaker.SetInfo("粉红猪小妹", "猪倌")
speaker.Speak()
fmt.Printf("%T ==== %+v", speaker, speaker)
}
网友评论