建造者模式
一个Builder类会一步一步构造最终的对象,该Builder类是独立于其他对象的
主要解决在软件系统中,有时候面临一个复杂对象的创建工作,通常这个复杂对象由各个部分的子对象用一定的算法构建成。由于需求的变化,这个复杂对象的各个部分通常会出现巨大的变化,所以,将各个子对象独立出来,容易修改
实现
- 建造所有产品的接口
type Builder interface {
Process1()
Process2()
Process3()
}
- 实现具体的产品
type IntBuilder struct {
result int64
}
func (s *IntBuilder)Process1() {
s.result += 1
}
func (s *IntBuilder)Process2() {
s.result += 2
}
func (s *IntBuilder)Process3() {
s.result += 3
}
func (s *IntBuilder)GetResult() int64 {
return s.result
}
type StringBuilder struct {
result string
}
func (s *StringBuilder)Process1() {
s.result += "1"
}
func (s *StringBuilder)Process2() {
s.result += "2"
}
func (s *StringBuilder)Process3() {
s.result+= "3"
}
func (s *StringBuilder)GetResult() string {
return s.result
}
- 实现一个导向
type Directory struct {
builder Builder //建造者接口
}
//创建一个接口
func newDirectory( builder Builder) *Directory {
return &Directory{builder:builder}
}
//建造顺序
func (d *Directory)Makedata() {
d.builder.Process1()
d.builder.Process2()
d.builder.Process3()
}
- 测试
func TestDirectory_Makedata(t *testing.T) {
builder := &StringBuilder{}
dict := newDirectory(builder)
dict.Makedata()
fmt.Println(builder.GetResult())
builder1 := &IntBuilder{}
dict1 := newDirectory(builder1)
dict1.Makedata()
fmt.Println(builder1.GetResult())
}
优点
- 将一个系统中的变与不变分离,容易拓展
- 便于控制细节风险
缺点
产品必须有共同特点,范围有限