工厂模式
- Golang的结构体没有构造函数,通常使用工厂模式来解决这个问题
- 需求:下面的student结构体在model包内,且是首写字母是小写,当我们想再其他包中创建一个student实例(此时无法通过导入model包进行创建),这时可以用工厂模式解决。
package model
type student struce{
Name string
...
}
package model
type student struce{
Name string
Score float64
}
//因为student结构体首字母小写,此时只能在model中使用
//当我们想要在其他包中使用student来创造其一个实例,此时用工厂模式,构造下面的函数
func NewStudent(n string, s float64)*student{
return &student{
Name:n,
Score:s,
}
}
//其他包,导入model包,从src开始导入model包的路径
package main
import (
"fmt"
".../.../model"
)
func main() {
//创建一个student实例
var stu = model.NewStudent("tom", 84.8)//因为NewStudent返回student指针,所以stu是一个指针
fmt.Println(stu)//输出 &{......}
fmt.Println(*stu)//输出 {......}
fmt.Println("name=",stu.Name, "score=", stu.score)//输出 name=tom, score=84.8
}
- 思考:当上述model包中student结构体的字段首字母变成小写,上述输出还能得到吗?
- 不能,此时可以通过方法
package model
type student struce{
Name string
score float64
}
//因为student结构体首字母小写,结构体字段名小写,此时只能在model中使用
func NewStudent(n string, s float64)*student{
return &student{
Name:n,
Score:s,
}
}
func (s *student)GetScore()float64{
return s.score
}
package main
import (
"fmt"
".../.../model"
)
func main() {
//创建一个student实例
var stu = model.NewStudent("tom", 94.8)//因为NewStudent返回student指针,所以stu是一个指针
fmt.Println(stu)//输出 &{......}
fmt.Println(*stu)//输出 {......}
fmt.Println("name=",stu.Name, "score=", stu.GetScore())//输出 name=tom, score=94.8
}