场景
老板:生产一类复杂的产品,这些产品有同样的生产规模,都需要经过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())
}