工厂模式


说明:

  Golang的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。

看一个需求:

一个结构体的声明是这样的:

package model
type Student struct {
  Name string...
}

因为这里的Student 的首字母S是大写的,如果我们想在其它包创建Student的实例(比如main包),引入model包后,就可以直接创建Student结构体的变量(实例)。
但是问题来了,如果首字母是小写的,比如是 type student struct {...} 就不行了,怎么办---》工厂模式来解决。

 

工厂模式来解决问题:

使用工厂模式实现挎包创建结构体实例(变量)的案例:

1)如果model 包的 结构体变量首字母大写,引入后,直接使用,没有问题。

model包里的代码:
package model

//定义一个结构体

type Student struct {
  Name string
  Score float64
}

main包里面的代码
package main
import (
  "fmt"
  "chapter04/chapter08/model"
)

func main() {
  //创建一个Student实例
  var stu = model.Student{
    Name : "tom",
    Score : 78.9,
  }
  fmt.Println(stu)
}

上面的代码是正常些的,结构体变量的首字母是大写的,可以正常使用。不会有错误。


2)如果model 包的 结构体变量首字母小写,引入后,不能直接使用,可以工厂模式解决。

model包的代码:

package model

//定义一个结构体

type student struct {
  Name string
  Score float64
}

//因为student结构体首字母是小写,因此是只能在model包使用。
//我们通过工厂模式来解决问题

func NewStudent(n string, s float64) *student {
  return &student {
    Name : n,
    Score : s,
  }
}


main包的代码:

package main
import (
  "fmt"
  "chapter04/chapter08/model"
)

func main() {

  //定student结构体是首字母小写,我们可以通过工厂模式来解决
  var stu = model.NewStudent("tom~", 88.8) //stu 接收的是一个指针
  fmt.Println(*stu)
  fmt.Println("name=", stu.Name, "score=", stu.Score)
}

思考题:

如果model包的student 的结构体的字段 Score 改成 score,我们还能正常访问吗? 又应该如何解决这个问题呢?

解决方法:
package model

//定义一个结构体

type student struct {
  Name string
  score float64
}

//因为student结构体首字母是小写,因此是只能在model包使用。
//我们通过工厂模式来解决问题

func NewStudent(n string, s float64) *student {
  return &student {
    Name : n,
    score : s,
  }
}

//如果score字段首字母小写,则在其它包不可以直接访问。
func (s *student) GetScore() float64 {
  return s.score //ok
}


main包:

package main
import (
  "fmt"
  "chapter04/chapter08/model"
)

func main() {

  //定student结构体是首字母小写,我们可以通过工厂模式来解决
  var stu = model.NewStudent("tom~", 88.8)
  fmt.Println(*stu)
  fmt.Println("name=", stu.Name, "score=", stu.GetScore())
}

 

转载于:https://www.cnblogs.com/green-frog-2019/p/11408187.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值