go语言工厂模式

2019-12-30  本文已影响0人  HaigLee

作者:HaigLee
https://www.jianshu.com/u/67ec21fb270d
本文由 HaigLee 发布。未经许可,禁止转载。

1. 说明

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

2. 需求示例

一个结构体的声明:

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

因为这里的Student 的首字母S是大写的,如果我们想在其它包括创建Student 的实例(比如main包),引入model 包后,就可以直接创建Student 结构体的变量(实例)。但是问题来了,如果首字母是小写的,比如是:

type student struct{
    ...
}

那么直接使用就不行了,这时候该怎么办呢?
使用工厂模式来解决!

3. 工厂模式解决的问题

package model

// 定义一个结构体
type Student struct{
    Name string
    Score float64
}

main包代码:

package main
import (
    "fmt"
    "xxx/xx..xx/xxx/model" // src 下目录名称
)

func main(){
    var str = model.Student{
        Name : "tom",
        Score: "66.6",
    }
    fmt.Println(stu)
}
  1. 如果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"
    "xxx/xx..xx/xxx/model" // src 下目录名称
)

func main(){
   var stu = model.NewStudent("tom~", 88.8) // 返回的也是指针
    fmt.Println(stu)// &(.......)
    fmt.Println(*stu)//  返回值
    fmt.Println(stu.Score)// 这个编译器可以做(*stu) 默认处理。
}
  1. 如果结构体中score 字段首字母小写,那么,在其他包不可以直接使用该字段,我们可以通过提供一个方法来解决。

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,
    }
}

//获取score 方法
func (s *student) GetScore() float64{
    // return (*s).score 
    return s.score
}

main包代码:

package main
import (
    "fmt"
    "xxx/xx..xx/xxx/model" // src 下目录名称
)

func main(){
   var stu = model.NewStudent("tom~", 88.8) // 返回的也是指针
    fmt.Println(stu)// &(.......)
    fmt.Println(*stu)//  返回值
    fmt.Println(stu.GetScore())// 这个编译器可以做(*stu) 默认处理。
}

作者:HaigLee
https://www.jianshu.com/u/67ec21fb270d
本文由 HaigLee 发布。未经许可,禁止转载。

上一篇下一篇

猜你喜欢

热点阅读