模式定义
将一个简单对象的创立与他的示意拆散,使得同样的构建过程能够创立不同的示意
类图
利用场景
1.须要生成的对象具备简单的内部结构;
2.须要生成的对象外部属性自身相互依赖;
3.与不可变对象配合应用;
长处
1.建造者独立,易扩大;
2.便于管制细节危险;
要点总结
- Builder模式次要用于“分步骤构建一个简单的对象”,在这其中“分步骤”是一个稳固的算法,而简单对象的各个局部则常常变动
- 变动点在哪里,封装哪里----Builder模式次要在于应答“简单对象各个局部”的频繁需要变动,其毛病在于难以应答“分步骤构建算法”的需要变动
Go语言代码实现
工程目录
Builder.go
package Buildertype Builder interface { Part1() Part2() Part3()}type Director struct { builder Builder //建造者的接口}//发明接口func NewDirector (builder Builder) *Director { return &Director{builder: builder}}func (d *Director) Makedata(){ d.builder.Part1() d.builder.Part2() d.builder.Part3()}
StringBuilder.go
package Buildertype StringBuilder struct { result string}func (sb *StringBuilder) Part1 () { sb.result += "1"}func (sb *StringBuilder) Part2 () { sb.result += "2"}func (sb *StringBuilder) Part3 () { sb.result += "3"}func (sb *StringBuilder) GetResult() string { return sb.result}
IntBuilder.go
package Buildertype IntBuilder struct { result int64}func (ib *IntBuilder) Part1 () { ib.result += 1}func (ib *IntBuilder) Part2 () { ib.result += 2}func (ib *IntBuilder) Part3 () { ib.result += 3}func (ib *IntBuilder) GetResult() int64 { return ib.result}
Builder_test.go
package Builderimport ( "fmt" "testing")func TestIntBuilder(t *testing.T) { sbuilder := &StringBuilder{} dict := NewDirector(sbuilder) dict.Makedata() fmt.Println(sbuilder.GetResult()) ibuilder := &IntBuilder{} dict = NewDirector(ibuilder) dict.Makedata() fmt.Println(ibuilder.GetResult())}