一.建造者模式的定义
构造者模式的意图在于将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
二.组成
建造者模式由以下几个关键角色组成:
1.产品: 表示被构建的复杂对象。产品类通常具有多个属性。
2.抽象构造者:定义了创建产品的抽象接口,包括各个构建步骤的方法。
3.具体建造者:实现了抽象建造者接口,负责实际构建产品。
4.指挥者:负责使用构建者对象构建产品。它定义了构建的顺序和步骤,同构调用建造者的方法来构建产品。
三.使用步骤
1.定义产品类,确定产品的属性和方法。
2.创造抽象建造者接口,定义产品构建的各个步骤方法
3.创建具体建造者类,实现抽象建造者接口。在具体建造者类中,实现每个步骤方法来构建产品的各个部分,并提供获取最终产品的方法。
4.创建指挥者:负责按照特定顺序调用建造者的方法来构建产品。
5.在客户端代码中,创建具体建造者对象和指挥者对象,并通过指挥者对象来构建产品。
四.代码示例
type Product struct {
parts []string
}
func (p *Product) AddPart(part string) {
p.parts = append(p.parts, part)
}
func (p *Product) ShowParts() {
fmt.Println("Product parts:")
for _, part := range p.parts {
fmt.Println(part)
}
}
type Builder interface {
BuildPartA()
BuildPartB()
GetResult() *Product
}
type ConcreteBuilder struct {
product *Product
}
func NewConCreteBuilder() *ConcreteBuilder {
return &ConcreteBuilder{
product: &Product{},
}
}
func (s *ConcreteBuilder) BuildPartA() {
s.product.AddPart("Part A")
}
func (s *ConcreteBuilder) BuildPartB() {
s.product.AddPart("Part B")
}
func (s *ConcreteBuilder) GetResult() *Product {
return s.product
}
type Director struct {
builder Builder
}
func (d *Director) Construct() {
d.builder.BuildPartA()
d.builder.BuildPartB()
}
func main() {
builder := NewConCreteBuilder()
director := &Director{builder: builder}
director.Construct()
product := builder.GetResult()
product.ShowParts()
}
五.优点
1.将一个复杂对象的创建过程封装起来
2.解耦了组装过程和创建具体的部件,使得我们不用去关心每个部件是如何组装的