(二) 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编程知识
原文地址:https://www.cnblogs.com/zgq0/p/12315940.html