zoukankan      html  css  js  c++  java
  • 工厂模式


    说明:

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

    看一个需求:

    一个结构体的声明是这样的:

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

    因为这里的Student 的首字母S是大写的,如果我们想在其它包创建Student的实例(比如main包),引入model包后,就可以直接创建Student结构体的变量(实例)。
    但是问题来了,如果首字母是小写的,比如是 type student struct {...} 就不行了,怎么办---》工厂模式来解决。

    工厂模式来解决问题:

    使用工厂模式实现挎包创建结构体实例(变量)的案例:

    1)如果model 包的 结构体变量首字母大写,引入后,直接使用,没有问题。

    model包里的代码:
    package model

    //定义一个结构体

    type Student struct {
      Name string
      Score float64
    }

    main包里面的代码
    package main
    import (
      "fmt"
      "chapter04/chapter08/model"
    )

    func main() {
      //创建一个Student实例
      var stu = model.Student{
        Name : "tom",
        Score : 78.9,
      }
      fmt.Println(stu)
    }

    上面的代码是正常些的,结构体变量的首字母是大写的,可以正常使用。不会有错误。


    2)如果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"
      "chapter04/chapter08/model"
    )

    func main() {

      //定student结构体是首字母小写,我们可以通过工厂模式来解决
      var stu = model.NewStudent("tom~", 88.8) //stu 接收的是一个指针
      fmt.Println(*stu)
      fmt.Println("name=", stu.Name, "score=", stu.Score)
    }

    思考题:

    如果model包的student 的结构体的字段 Score 改成 score,我们还能正常访问吗? 又应该如何解决这个问题呢?

    解决方法:
    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 //ok
    }


    main包:

    package main
    import (
      "fmt"
      "chapter04/chapter08/model"
    )

    func main() {

      //定student结构体是首字母小写,我们可以通过工厂模式来解决
      var stu = model.NewStudent("tom~", 88.8)
      fmt.Println(*stu)
      fmt.Println("name=", stu.Name, "score=", stu.GetScore())
    }

  • 相关阅读:
    笔记20200521002:多线程【线程的优先级】
    笔记20200521001:多线程【守护线程】
    笔记20200520:多线程【线程强制执行_join】
    笔记20200519:多线程【线程礼让_yield】
    笔记20200518:多线程【线程休眠_sleep】
    2020.4.4号全国疫情哀悼日网页变灰色前端是如何实现的?-pink老师
    2020年最新版Web前端学习路线图-前端小白入门必读-pink老师推荐
    ECharts数据可视化项目-大屏数据可视化展示-echarts 图表入门基础视频制作-pink老师直播课更新完毕
    2019前端学习路线心得-黑马程序员pink老师
    2019年最新超级有趣好玩的html+css网页布局课程,前端入门基础,html5+css3零基础入门课程-黑马程序员pink老师精心录制
  • 原文地址:https://www.cnblogs.com/green-frog-2019/p/11408187.html
Copyright © 2011-2022 走看看