Go 工厂模式详解

工厂模式详解

  • 说明
    • Golang 的结构体没有构造函数,通常可以使用工厂模式来解决这个问题。
  • 看一个需求
    • 一个结构体的声明是这样的:
package model
type Student struct {
    Name string... 
}
  • 因为这里的 Student 的首字母 S 是大写的,如果我们想在其它包创建 Student 的实例(比如 main 包),引入 model 包后,就可以直接创建 Student 结构体的变量(实例)。
  • 但是问题来了,如果首字母是小写的,比如 是 type student struct {....} 就不不行了,怎么办---> 工厂模式来解决.

  • 工厂模式来解决问题
    • 使用工厂模式实现跨包创建结构体实例。
    • 如果 model 包的 结构体变量首字母大写,引入后,直接使用, 没有问题


  • 如果 model 包的 结构体变量首字母小写,引入后,不能直接使用, 可以工厂模式解决
    • model.go 文件中
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.go文件中
package main
import (
	"fmt"
	"go_code/chapter10/factory/model"
)

func main() {
	//定student结构体是首字母小写,我们可以通过工厂模式来解决
	var stu = model.NewStudent("tom", 98.8)

	fmt.Println(*stu) //&{....}
	fmt.Println("name=", stu.Name, " score=", stu.Score)
}
  • 输出结果;


  • 如果 model 包的 student 的结构体的字段 Score 改成 score,就不能正常访问了,又应该如何解决这个问题呢?
-- 如果score字段首字母小写,则在其它包不可以直接方法,我们可以提供一个方法
func (s *student) GetScore() float64{
	return s.score //ok
}
  • 在main.go中调用:
fmt.Println("name=", stu.Name, " score=", stu.GetScore())

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值