工厂模式
说明
Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。
看一个需求
一个结构体的声明是这样的:
package model
type Student struct {
Name string...
}
因为这里的 Student 的首字母 S 是大写的,如果我们想在其它包创建 Student 的实例(比如 main 包), 引入 model 包后,就可以直接创建 Student 结构体的变量(实例)。但是问题来了,如果首字母是小写的, 比如 是 type student struct {…} 就不不行了,怎么办—> 工厂模式来解决.
package model
type Student struct{
Name string
Score float64
}
package main
import (
"fmt"
"go_code/fatory/model"
)
func main() {
var stu = model.Student{
Name :"tom",
Score : 78,
}
fmt.Println(stu)
}
如果 model 包的 结构体变量首字母小写,引入后,不能直接使用, 可以工厂模式解决, 代码:
student.go
package model
type student struct{
Name string
Score float64
}
//student结构体小写,所以为是由
func NewStudent(n string, s float64) *student{
return &student{
Name : n,
Score : s,
}
}
main.go
package main
import (
"fmt"
"go_code/fatory/model"
)
func main() {
// var stu = model.student{
// Name :"tom",
// Score : 78,
// }
//当小写时
var stu = model.NewStudent("tom~", 88)
fmt.Println(*stu)
}
思考题
同学们思考一下,如果 model 包的 student 的结构体的字段 Score 改成 score,我们还能正常访问 吗?又应该如何解决这个问题呢?[老师给出思路,学员自己完成]
- 解决方法如下:
package model
type student struct{
Name string
score float64
}
//student结构体小写,所以为是由
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"
"go_code/fatory/model"
)
func main() {
// var stu = model.student{
// Name :"tom",
// Score : 78,
// }
//当小写时
var stu = model.NewStudent("tom~", 88)
// fmt.Println(*stu)、
fmt.Println(stu.Name, stu.GetScore())
}
面向对象编程思想-抽象
抽象的介绍
我们在前面去定义一个结构体时候,实际上就是把一类事物的共有的属性(字段)和行为(方法)提取 出来,形成一个物理模型(结构体)。这种研究问题的方法称为抽象。
package main
import (
"fmt"
)
//定义一个结构体 Account type Account struct {
AccountNo string Pwd string Balance float64
}
//方法
//1. 存款
func (account *Account) Deposite(money float64, pwd string) {
//看下输入的密码是否正确 if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
//看看存款金额是否正确 if money <= 0 {
fmt.Println("你输入的金额不正确")
return
}
account.Balance += money fmt.Println("存款成功~~")
}
//取款
func (account *Account) WithDraw(money float64, pwd string) {
//看下输入的密码是否正确 if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
//看看取款金额是否正确
if money <= 0 || money > account.Balance { fmt.Println("你输入的金额不正确") return
}
account.Balance -= money fmt.Println("取款成功~~")
}
//查询余额
func (account *Account) Query(pwd string) {
//看下输入的密码是否正确 if pwd != account.Pwd {
fmt.Println("你输入的密码不正确")
return
}
fmt.Printf("你的账号为=%v 余额=%v \n", account.AccountNo, account.Balance)
}
func main() {
//测试一把
account := Account{ AccountNo : "gs1111111", Pwd : "666666",
Balance : 100.0,
}
//这里可以做的更加灵活,就是让用户通过控制台来输入命令...
//菜单.... account.Query("666666")
account.Query("666666") account.WithDraw(150.0, "666666") account.Query("666666")
}