美文网首页
go语言工厂模式

go语言工厂模式

作者: HaigLee | 来源:发表于2019-12-30 00:31 被阅读0次

    作者: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. 工厂模式解决的问题

    • 使用工厂模式实现挎包创建结构体实例(变量)的案例:
      1)如果model 包的结构体变量首字母大写,引入后,直接使用,没有问题;
      例如:
      model包代码:
    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 发布。未经许可,禁止转载。

    相关文章

      网友评论

          本文标题:go语言工厂模式

          本文链接:https://www.haomeiwen.com/subject/knluoctx.html