• (二) go语言设计模式-创建模式之抽象工厂模式(Abstract Factory)


    抽象工厂模式介绍 

    在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类,每个生成的工厂都能按照工厂模式提供对象。改模式的意图是提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类,主要解决主要解决接口选择的问题。

    抽象工厂模式go实现

    抽象工厂实现的UML图

    1. 首先定义Worker接口,其中包含一个Work(task *string)方法。

    2. 然后定义创建Worker的接口WorkerCreator,包含一个接口Create() ,返回值为Worker。

    type Worker interface {
        Work(task *string)
    }
    
    type WorkerCreator interface {
        Create() Worker
    }
    

      

    1.我们假设有一Worker叫Programmer,它实现了Work接口。

    2.定义Programmer的构造类叫ProgrammerCreator,它实现了Create()接口。

     
    type Programmer struct {
    }
    
    func (p *Programmer) Work(task *string) {
        fmt.Println("Programmer process", *task)
    }
    
    type ProgrammerCreator struct {
    }
    
    func (c *ProgrammerCreator) Create() Worker {
        s := new(Programmer)
        return s
    }
    

      

    1.我们假设还有一Worker叫Farmer,它实现了Work接口。

    2.定义Farmer的构造类叫FarmerCreator,它实现了Create()接口。

    type Farmer struct {
    }
    
    func (f *Farmer) Work(task *string) {
        fmt.Println("Farmer process", *task)
    }
    
    type FarmerCreator struct {
    }
    
    func (c *FarmerCreator) Create() Worker {
        s := new(Farmer)
        return s
    }
    

      

    测试代码:

    func main() {
        var c WorkerCreator
        c = new(ProgrammerCreator)
        p := c.Create()
        taskProject := "Project"
        p.Work(&taskProject)
    
        c = new(FarmerCreator)
        f := c.Create()
        taskFarmland := "farmland"
        f.Work(&taskFarmland)
    }
    

      

    运行结果:

    完整代码:

    package main
    ​
    import (
      "fmt"
    )
    ​
    type Worker interface {
      Work(task *string)
    }
    ​
    type WorkerCreator interface {
      Create() Worker
    }
    ​
    //Programmer
    type Programmer struct {
    }
    ​
    func (p *Programmer) Work(task *string) {
      fmt.Println("Programmer process: ", *task)
    }
    ​
    type ProgrammerCreator struct {
    }
    ​
    func (c *ProgrammerCreator) Create() Worker {
      s := new(Programmer)
      return s
    }
    ​
    //Farmer
    type Farmer struct {
    }
    ​
    func (f *Farmer) Work(task *string) {
      fmt.Println("Farmer process:", *task)
    }
    ​
    type FarmerCreator struct {
    }
    ​
    func (c *FarmerCreator) Create() Worker {
      s := new(Farmer)
      return s
    }
    ​
    func main() {
      var c WorkerCreator
    ​
      c = new(ProgrammerCreator)
      p := c.Create()
      taskProject := "Project"
      p.Work(&taskProject)
    ​
      c = new(FarmerCreator)
      f := c.Create()
      taskFarmland := "farmland"
      f.Work(&taskFarmland)
    }
    

      

    注:代码是从网络上找的

                               关注该公众号,带来更多go编程知识
  • 相关阅读:
    如何在windows下搭建PHP运行环境?
    如何安装Moodle课程包
    2009人工智能与教育应用国际学术会议 (ICAIE'09)
    利用EasyPHP搭建Moodle平台(转)
    SharePoint Server 2007序列号 (转 )
    2009 International Conference on ELearning, EBusiness, Enterprise Information Systems, and EGovernment (EEEE 2009)
    第二届IEEE信息技术与教育国际会议
    原创:利用APMserv快速搭建Moodle平台
    PHP数组的定义、初始化和数组元素的显示
    office2007新建 Microsoft Office Word 文档.docx,打开后弹出转换文件对话框的解决办法
  • 原文地址:https://www.cnblogs.com/zgq0/p/12315940.html
Copyright © 2020-2023  润新知