模式定义
将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示
类图
应用场景
1.需要生成的对象具有复杂的内部结构;
2.需要生成的对象内部属性本身相互依赖;
3.与不可变对象配合使用;
优点
1.建造者独立,易扩展;
2.便于控制细节风险;
要点总结
- Builder模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化
- 变化点在哪里,封装哪里----Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动,其缺点在于难以应对“分步骤构建算法”的需求变动
Go语言代码实现
建造者模式(Builder Pattern)是一种创建型设计模式,它允许你按照步骤构建复杂对象。建造者模式将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。
建造者模式适用于需要创建具有多个组件或参数的复杂对象,并且需要灵活地构建不同表示的对象。它将构建过程分解为一系列步骤,并使用一个指导者(Director)来协调这些步骤,最终构建出一个完整的对象。
以下是使用Golang实现建造者模式的示例代码:
package main
import "fmt"
// Product 产品结构
type Product struct {
partA string
partB string
partC string
}
// Builder 建造者接口
type Builder interface {
BuildPartA()
BuildPartB()
BuildPartC()
GetResult() Product
}
// ConcreteBuilder 具体建造者
type ConcreteBuilderA struct {
product Product
}
func (b *ConcreteBuilderA) BuildPartA() {
b.product.partA = "Part A"
}
func (b *ConcreteBuilderA) BuildPartB() {
b.product.partB = "Part B"
}
func (b *ConcreteBuilderA) BuildPartC() {
b.product.partC = "Part C"
}
func (b *ConcreteBuilderA) GetResult() Product {
return b.product
}
// ConcreteBuilder 具体建造者
type ConcreteBuilderB struct {
product Product
}
func (b *ConcreteBuilderB) BuildPartA() {
b.product.partA = "Part A"
}
func (b *ConcreteBuilderB) BuildPartB() {
b.product.partB = "Part B"
}
func (b *ConcreteBuilderB) BuildPartC() {
b.product.partC = "Part C"
}
func (b *ConcreteBuilderB) GetResult() Product {
return b.product
}
// Director 指导者
type Director struct {
builder Builder
}
func (d *Director) Construct() Product {
d.builder.BuildPartA()
d.builder.BuildPartB()
d.builder.BuildPartC()
return d.builder.GetResult()
}
func main() {
builderA := &ConcreteBuilderA{} // 创建具体建造者A
director := &Director{builderA} // 创建指导者,并将建造者传递给指导者
productA := director.Construct() // 指导者构建产品
fmt.Println("ProductA Part A:", productA.partA)
fmt.Println("ProductA Part B:", productA.partB)
fmt.Println("ProductA Part C:", productA.partC)
builderB := &ConcreteBuilderB{} // 创建具体建造者B
director := &Director{builderB} // 创建指导者,并将建造者传递给指导者
productB := director.Construct() // 指导者构建产品
fmt.Println("ProductB Part A:", productB.partA)
fmt.Println("ProductB Part B:", productB.partB)
fmt.Println("ProductB Part C:", productB.partC)
}
在上述示例中,我们定义了一个Product结构,它表示最终构建出的产品。然后,我们定义了一个Builder接口,其中包含了构建产品的各个步骤,以及获取最终产品的方法。ConcreteBuilder是具体的建造者,它实现了Builder接口中的方法,并负责构建产品的不同部分。
Director是指导者,它接收一个具体的建造者,并通过调用建造者的方法来按照一定的顺序构建产品。最后,我们在main函数中创建一个具体的建造者和指导者,并调用指导者的Construct方法来构建产品。最终,我们打印出产品的各个部分来验证建造者模式的实现。
这样,建造者模式可以使你通过一系列步骤构建复杂的对象,同时将构建过程与最终产品的表示分离,使得相同的构建过程可以创建不同的表示。
建造者设计模式和模板方法设计模式的异同点
建造者设计模式(Builder Pattern)和模板方法设计模式(Template Method Pattern)是两种不同的设计模式,它们在对象构建和行为定义方面有一些异同点。
异同点如下:
目的和关注点:
建造者设计模式的目的是将复杂对象的构建过程与其表示分离,通过一系列步骤逐步构建对象。它关注对象的构建过程和构建步骤的组合。
模板方法设计模式的目的是定义一个算法的骨架,将具体步骤的实现延迟到子类中。它关注算法的定义和具体步骤的扩展。
类型:
建造者设计模式是创建型设计模式,主要用于构建复杂对象。
模板方法设计模式是行为型设计模式,主要用于定义算法的骨架。
使用方式:
建造者设计模式使用一系列步骤来构建对象,每个步骤由具体的建造者实现,最终由指导者进行协调和返回构建的对象。
模板方法设计模式定义一个算法的骨架,其中某些步骤由父类定义并实现,而某些步骤由子类具体实现。
关注点的差异:
建造者设计模式关注的是对象的构建过程和步骤的组合,强调构建对象的灵活性和可定制性。
模板方法设计模式关注的是定义算法的骨架和步骤的扩展,强调算法的复用和步骤的统一性。
虽然建造者设计模式和模板方法设计模式在目的、使用方式和关注点上有差异,但它们都有助于提高代码的可维护性、扩展性和复用性。具体使用哪种设计模式取决于需求和场景的不同。