首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go设计模式之建造者模式

go设计模式之建造者模式

原创
作者头像
暮雨
修改2018-11-28 16:18:21
5140
修改2018-11-28 16:18:21
举报
文章被收录于专栏:云端漫步云端漫步

这是要写的创建类模式最后一篇,先看下,建造者模式的定义吧。

将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示。

看到这个定义有点难懂,建造者有以下几个角色。

  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)

}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档