文章目录
前言
本文章尝试使用go实现"建造者"。
代码
go
package main
import (
"fmt"
)
// 产品1。可以有不同的毫无相关的产品,这里只举一个
type Product1 struct {
parts []string
}
// 产品1逻辑。打印组成产品的部分
func (p *Product1) ListParts() {
parts := p.parts
length := len(parts)
fmt.Print("Product parts: ")
for i := 0; i < length; i++ {
if i == length-1 {
fmt.Print(parts[i])
} else {
fmt.Print(parts[i], ", ")
}
}
fmt.Println()
fmt.Println()
}
// 建造者接口提供分别创建所有产品部分的方法。这里举例产品最多有三个部分。
// 返回IBuilder接口,以便链式调用
// 由于组建完成后要返回的产品各式各样,比如产品1、2、3......,可能没有相同的接口,这里就不提供返回产品的方法了
type IBuilder interface {
ProducePartA() IBuilder
ProducePartB() IBuilder
ProducePartC() IBuilder
}
// 具体建造者1。对应返回产品1,这里只举一个。按不同配置需求返回的产品1也不尽相同
type ConcreteBuilder1 struct {
product Product1
}
func (cb *ConcreteBuilder1) Reset() {
cb.product = Product1{}
}
func (cb *ConcreteBuilder1) ProducePartA() IBuilder {
cb.product.parts = append(cb.product.parts, "PartA1")
return cb
}
func (cb *ConcreteBuilder1) ProducePartB() IBuilder {
cb.product.parts = append(cb.product.parts, "PartB1")
return cb
}
func (cb *ConcreteBuilder1) ProducePartC() IBuilder {
cb.product.parts = append(cb.product.parts, "PartC1")
return cb
}
// 获取产品1。不同产品可能没有共同的实现接口,故返回类型为具体产品类
func (cb *ConcreteBuilder1) GetProduct() Product1 {
result := cb.product
cb.Reset()
return result
}
// go语言使用普通函数实现构造函数
func NewConcreteBuilder1() *ConcreteBuilder1 {
cb := ConcreteBuilder1{}
cb.Reset()
return &cb
}
// 主管。接收建造者,并根据配置需求要求建造者创建包含部分组件的对象
type Director struct {
builder IBuilder
}
func (d *Director) SetBuilder(builder IBuilder) {
d.builder = builder
}
func (d *Director) BuildMinimalViableProduct() {
d.builder.ProducePartA()
}
func (d *Director) BuildFullFeaturedProduct() {
d.builder.ProducePartA().ProducePartB().ProducePartC()
}
// 客户端代码
func clientCode(d *Director) {
builder := NewConcreteBuilder1()
d.SetBuilder(builder)
fmt.Println("Standard basic product:")
d.BuildMinimalViableProduct()
p := builder.GetProduct()
p.ListParts()
fmt.Println("Standard full featured product:")
d.BuildFullFeaturedProduct()
p = builder.GetProduct()
p.ListParts()
// 不通过主管也能自定义创建产品
fmt.Println("Custom product:")
builder.ProducePartA()
builder.ProducePartC()
p = builder.GetProduct()
p.ListParts()
}
func main() {
clientCode(&Director{})
}
结果
Standard basic product:
Product parts: PartA1
Standard full featured product:
Product parts: PartA1, PartB1, PartC1
Custom product:
Product parts: PartA1, PartC1
总结
新人设计模式理解,望大家多多指点。