我的第一篇文章[go设计模式之工厂模式浅谈|Go主题月](https://studygolang.com/articles/34254)中谈了一下工厂方法,发现我之前的思路是错误的,在此修改我错误的想法
#### 2.工厂方法
工厂方法模式,简单来说是来为了解决简单工厂模式所出现的一些缺点而进行的改进。比如当一个简单的工厂模式要生产一种动物。能够生产Dog,Cat.但是如果要新增一种动物。那么就要修改源代码,也就是修改工厂的源代码!添加一个业务逻辑,显然不符合开闭原则,所以就有了工厂方法模式。提供一个抽象工厂方法模式,这样就可以避免新增的时候修改源代码,只要新建一个类来继承了工厂方法模式即可。
```go
//Animal接口,描述动物具有哪些功能
type Animal interface {
Call()
}
//Dog结构体
type Dog struct{}
//实现Animal接口
func (*Dog) Call() {
fmt.Println("dog call")
}
//实现动物工厂AnimalFactry接口
func (*Dog) Create() Animal {
return &Dog{}
}
//Cat结构体
type Cat struct{}
//实现Animal接口
func (*Cat) Call() {
fmt.Println("cat call")
}
//实现动物工厂AnimalFactry接口
func (*Cat) Create() Animal {
return &Cat{}
}
```
```go
//工厂接口
type AnimalFactry interface {
Create() Animal
}
//工厂方法
func Create(animal AnimalFactry) Animal {
return animal.Create()
}
```
使用
```go
dog := Create(&Dog{})
dog.Call()
cat := Create(&Cat{})
cat.Call()
```
## 通过Dog,Cat实现AnimalFactry和Animal,再由Create这个工厂方法生成对应的类,这时如果再添加一个Duck鸭子类,只需专心实现Duck类就可以了,只要Duck实现AnimalFactry和Animal即可
```go
type Duck struct{}
//实现Animal接口
func (*Duck) Call() {
fmt.Println("duck call")
}
//实现动物工厂AnimalFactry接口
func (*Duck) Create() Animal {
return &Duck{}
}
```
使用新类
```go
duck := Create(&Duck)
duck.Call()
```
有疑问加站长微信联系(非本文作者))