- 问题所在:代码重复
将复杂对象的构建(构造过程)与表示(构造方法)分离,使得同样的构建过程可以创建不同的表示。
把product和初始化方法放在concretebuilder中,然后传给director,由director定义调用的顺序还有调用哪些方法。
![](https://img.haomeiwen.com/i4559317/13e1e03af7567c32.png)
四种角色(5种包括客户端):
产品(Product):具体生产器要构造的复杂对象,它的各个组成部分由ConcreteBuilder生成,生成过程由Director(指导类)控制。注意该类中只提供了get方法,这个看具体需求。
抽象生成器(Builder):声明了生成器应包含的创建产品各个组成部件的方法。注意,这些方法只是生成对象的各组成部分,各方法相互独立,方法间无时序关系,也不存在“总”的生成方法。另外,Builder应包含获取生成的产品的方法。
具体生产器(ConcreteProduct):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法;每种不同的产品都有一个专属的ConcreteBuilder。
指导类(Director):用于控制产品的生成过程。Director的控制对象是Builder,即通过Director实现了对各类型产品的生成过程的重用。
客户端(Client):是生成器模式的使用者。对Client来说,生成的最终产品Product的类型是明确的,生成Product所使用的具体生成器ConcreteBuilder也是明确的
![](https://img.haomeiwen.com/i4559317/56fa81d63f57137d.png)
package main
import "fmt"
// 包含获取产品以及配置产品的方法
type Builder interface {
SetName(string)
GetProduct() Product
}
type Director struct {
// 负责指导产品的具体的生成过程
}
func (director *Director) Construct(builder Builder) {
builder.SetName("aaa")
}
type ConcreteBuilder1 struct {
Builder
product Product
}
func (this *ConcreteBuilder1) SetName(name string) {
this.product.name = name
}
func (this *ConcreteBuilder1) GetProduct() Product {
return this.product
}
type Product struct {
name string
}
func main() {
director := new(Director)
builder1 := new(ConcreteBuilder1)
director.Construct(builder1)
product := builder1.GetProduct()
fmt.Println(product)
}
网友评论