创建型设计模式——建造者模式

建造者模式(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())
}

运行示例代码

如上,我们实现 setWindowTypesetDoorTypesetNumFloor 这3个步骤,只需要创建对应的builder传递给主管,对应的主管就可以运行建造方法 buildHouse,完成3个步骤的执行。

参考文章:


也可以看看


全国大流量卡免费领

19元月租ㆍ超值优惠ㆍ长期套餐ㆍ免费包邮ㆍ官方正品