【一Go到底】第四十一天---工厂模式详解

68 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第41天,点击查看活动详情

说明

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

说明时候需要工厂模式

当结构体的名字是小写开头,需要在别的包创建结构体实例

使用工厂模式跨包创建结构体实例

当model包中的结构体的名字首字母是小写时,可以使用工厂模式

model.student包内容

package model

// 定义结构体

type Student struct {
	Name  string
	Score float64
}

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"
	"go_code/chapter27-struct/factoryModel/model"
)

func main() {
	// 创建一个 Student实例
	stu := model.Student{"阿里", 88.88}
	// student.go =  {阿里 88.88}
	fmt.Println("Student = ", stu)

	// 当 student结构体首字母小写,可以如下使用
	stuLow := model.NewStudent("小阿里", 44.44)
	// student factory =  {小阿里 44.44}
	fmt.Println("student factory = ", *stuLow)
	// name =  小阿里
	fmt.Println("name = ", stuLow.Name)
}

当结构体中的字段首字母小写,不可以直接访问

可以提供一个方法来解决

model包

package model

// 定义结构体

type Student struct {
	Name  string
	Score float64
}

type student struct {
	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  // 此处到底是值拷贝还是地址拷贝,取决于 student是否加 *
}


main包

package main

import (
	"fmt"
	"go_code/chapter27-struct/factoryModel/model"
)

func main() {
	// 创建一个 Student实例
	stu := model.Student{"阿里", 88.88}
	// student.go =  {阿里 88.88}
	fmt.Println("Student = ", stu)

	// 当 student结构体首字母小写,可以如下使用
	stuLow := model.NewStudent("小阿里", 44.44)
	// student factory =  {小阿里 44.44}
	fmt.Println("student factory = ", *stuLow)
	// name =  小阿里
	fmt.Println("name = ", stuLow.Name)

	// 访问首字母小写字段
	//score =  44.44
	fmt.Println("score = ", stuLow.GetScore()) // 这里还是使用指针来调用方法,只不过go底层有优化,*stuLow.GetScore 等同于 stuLow.GetScore
}