go语言工厂模式

HaigLee · · 958 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

作者: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 发布。未经许可,禁止转载。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:HaigLee

查看原文:go语言工厂模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

958 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传