go設計模式之建造者模式

這是要寫的創建類模式最後一篇,先看下,建造者模式的定義吧。

將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示。

看到這個定義有點難懂,建造者有以下幾個角色。

  1. Product 這是我們要創建的複雜對象(一般都是很複雜的對象才需要使用建造者模式)。
  2. Builder 抽象的一個東西, 主要是用來規範我們的建造者的。
  3. ConcreteBuilder 具體的Builder實現, 這是今天的重點,主要用來根據不用的業務來完成要創建對象的組建的創建。
  4. Director 這個的作用是規範複雜對象的創建流程。

基於以上的理論,我們還是通過代碼來實現

定義接口Builder

type Builder struct {

Part1()
Part2()
Part3()

}

定義Director

type Director struct {

Build Builder

}

func NewBuilder(build Builder) *Director {

return &Director{
    Build: build,
}

}

定義Director的ConcreteBuilder

//Construct Product

func (d *Director) Construct() {

d.builder.Part1()
d.builder.Part2()
d.builder.Part3()

}

接下來實現product這個產品

type Builder1 struct {

result string

}

func (b *Builder1) Part1() {

b.result += "1"

}

func (b *Builder1) Part2() {

b.result += "2"

}

func (b *Builder1) Part3() {

b.result += "3"

}

func (b *Builder1) GetResult() string {

return b.result

}

type Builder2 struct {

result int

}

func (b *Builder2) Part1() {

b.result += 1

}

func (b *Builder2) Part2() {

b.result += 2

}

func (b *Builder2) Part3() {

b.result += 3

}

func (b *Builder2) GetResult() int {

return b.result

}

以下實現的完整代碼

package main

import "fmt"

type Builder interface {

Part1()
Part2()
Part3()

}

type Director struct {

Builder Builder

}

func NewDirector(builder Builder) *Director {

return &Director{
   Builder:builder,
}

}

func (d *Director) Construct() {

d.Builder.Part1()
d.Builder.Part2()
d.Builder.Part3()

}

type Builder1 struct {

result string

}

func (b *Builder1) Part1() {

b.result += "1"

}

func (b *Builder1) Part2() {

b.result += "2"

}

func (b *Builder1) Part3() {

b.result += "3"

}

func (b *Builder1) GetResult() string {

return b.result

}

type Builder2 struct {

result int

}

func (b *Builder2) Part1() {

b.result += 1

}

func (b *Builder2) Part2() {

b.result += 2

}

func (b *Builder2) Part3() {

b.result += 3

}

func (b *Builder2) GetResult() int {

return b.result

}

func main() {

builder1 := &Builder1{}
director1 := NewDirector(builder1)
director1.Construct()
res1 := builder1.GetResult()
fmt.Println("構造1", res1)
builder2 := &Builder2{}
director2 := NewDirector(builder2)
director2.Construct()
res2 := builder2.GetResult()
fmt.Println("構造2", res2)

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章