设计模式这样玩泰简单(Golang版)-建造者模式

场景

老板:生产一类复杂的产品,这些产品有同样的生产规模,都需要经过N道复杂工序制作.不同产品的工序处理方式可能有些区别,以后可能还会有这样的产品出来,设计一个做产品的方案吧
你:好的老板,那就使用建造者模式

方案

1.考虑产品的生产工序复杂,所以我们可以把生产产品的过程封在建造者内部.对每一道步骤定义为一个方法,由客户自行调用完成.注意其实这里还可以多一个所谓的指导者角色,就是指导生产产品的过程.
2.多种产品的规模相同,但是工序不同,所以可以用抽象对具体产品做抽象
3.对待不同的产品需要不同的建造者,所以同样的方案,我们可以对建造者做抽象处理

所以使用这样的方案,以后有新产品进驻时,直接通过增加产品跟建造者实现即可
在这里插入图片描述

实现

注意,实现忽略产品的抽象
see:github

package main

import "fmt"

type Product struct {
	FieldA string
	FieldB string
	FieldC string
	FieldD string
}

type AbstractBuilder interface {
	Init()
	SetFieldA()
	SetFieldB()
	SetFieldC()
	SetFieldD()
	Build() Product
}

type BuilderA struct {
	product *Product
}

func (b *BuilderA) Init() {
	b.product = &Product{}
}

func (b *BuilderA) SetFieldA() {
	if b.product == nil {
		panic("need init")
	}
	b.product.FieldA = "A"
}

func (b *BuilderA) SetFieldB() {
	if b.product == nil {
		panic("need init")
	}
	b.product.FieldB = "B"
}

func (b *BuilderA) SetFieldC() {
	if b.product == nil {
		panic("need init")
	}
	b.product.FieldC = "C"
}

func (b *BuilderA) SetFieldD() {
	if b.product == nil {
		panic("need init")
	}
	b.product.FieldD = "D"
}

func (b *BuilderA) Build() Product {
	return *b.product
}

func main() {
	fmt.Println("指导建造者搞一个复杂的产品")
	fmt.Println("好的")
	var builder AbstractBuilder
	builder = &BuilderA{}
	builder.Init()
	builder.SetFieldA()
	builder.SetFieldB()
	builder.SetFieldC()
	builder.SetFieldD()
	fmt.Printf("产品[%+v]", builder.Build())
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值