建造者模式(Builder)是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。
适合应用场景:
- 建造者模式通常适用于有多个构造器参数或者需要较多构建步骤的场景。使用建造者模式可以精简构造器参数的数量,让构建过程更有条理。
- 当可以为同一个产品提供两个不同的实现。例如石头或木头房屋。
在建造者模式中,我们需要清晰的定义每个步骤的代码,我们需要一个主管类,用这个主管类来管理各步骤。这样我们就只需要将所需参数传给一个构造函数,构造函数再将参数传递给对应的主管,最后由主管完成后续所有建造任务。
比如,在下面的代码中,为 house
类型创建了两个不同的实现,通过 stoneBuilder
构建石头房屋,以及通过 woodenBuilder
构建的木头房屋:
package main
import "fmt"
// 要创建的房屋
type house struct {
windowType string
doorType string
floor int
}
// 建造者接口
type iBuilder interface {
setWindowType()
setDoorType()
setNumFloor()
getHouse() house
}
// 石屋建造者
type stoneBuilder struct {
house
}
func newStoneBuilder() *stoneBuilder {
return &stoneBuilder{}
}
func (b *stoneBuilder) setWindowType() {
b.windowType = "Stone Window"
}
func (b *stoneBuilder) setDoorType() {
b.doorType = "Stone Door"
}
func (b *stoneBuilder) setNumFloor() {
b.floor = 1
}
func (b *stoneBuilder) getHouse() house {
return b.house
}
// 木屋建造者
type woodenBuilder struct {
house
}
func newWoodenBuilder() *woodenBuilder {
return &woodenBuilder{}
}
func (b *woodenBuilder) setWindowType() {
b.windowType = "Wooden Window"
}
func (b *woodenBuilder) setDoorType() {
b.doorType = "Wooden Door"
}
func (b *woodenBuilder) setNumFloor() {
b.floor = 2
}
func (b *woodenBuilder) getHouse() house {
return b.house
}
// 主管
type director struct {
builder iBuilder
}
func newDirector(b iBuilder) *director {
return &director{
builder: b,
}
}
func (d *director) setBuilder(b iBuilder) {
d.builder = b
}
func (d *director) buildHouse() house {
d.builder.setDoorType()
d.builder.setWindowType()
d.builder.setNumFloor()
return d.builder.getHouse()
}
// 开工
func main() {
stoneBuilder := newStoneBuilder()
director := newDirector(stoneBuilder)
fmt.Printf("stoneBuilder: %+v\n", director.buildHouse())
woodenBuilder := newWoodenBuilder()
director.setBuilder(woodenBuilder)
fmt.Printf("woodenBuilder: %+v\n", director.buildHouse())
}
如上,我们实现 setWindowType
、setDoorType
、setNumFloor
这3个步骤,只需要创建对应的builder传递给主管,对应的主管就可以运行建造方法 buildHouse
,完成3个步骤的执行。
参考文章: