简介
建造者模式是一种创建型设计模式,用于构建复杂对象,该模式将一个复杂对象的构建过程和它的表示进行分离,使得同样的构建过程可以创建不同的表示。通过使用构建模式,可以逐步构建一个复杂的对象,同时使得客户端不需要知道对象的内部构建细节。
建造者模式有如下主要角色:
产品 Product
产品是要构建的复杂对象,它通常包含多个部分
抽象建造者 Builder
抽象建造者定义了创建产品各个部分的抽象方法,以及一个返回最终产品的方法
具体建造者 Concreate Builder
具体建造者实现了抽象建造者接口,负责实际构建产品的各个部分,并提供一个返回最终产品的方法。
指导者 Director
指导者负责使用建造者的接口来构建产品,它不需要知道产品的具体构建细节,只需要知道如何使用建造者来构建产品。
一般来说,建造者模式有以下步骤:
定义产品的各个部分
抽象建造者接口声明了用于构建产品的各个部分的抽象方法,以及一个返回最终产品的方法。
定义抽象建造者接口
抽象建造者接口声明了用于构建产品各个部分的抽象方法,以及一个返回最终产品的方法。
实现具体建造者类
具体建造者类实现了抽象建造者接口,负责实际构建产品的各个部分,并提供一个返回最终产品的方法
定义产品类
产品类包含各个部分的属性和方法,并提供一个用于获取产品的方法。
定义指导者类
指导者类负责使用具体构建者来构建产品,可以根据客户端的需求调用具体建造者的方法,已完成产品的构建。
比如我们的产品是一辆车,它有轮子、座椅、方向盘、车架等等组成,但轮子又是橡胶等等组成、椅子又有布、铁等等组成,方向盘又有七七八八的,我们如果要组成一辆车,那根本不需要关心这些布啊铁啊之类的,我们只需要根据安装说明书,去拼装出来就可以了是吧。
Demo
// Car 产品类
type Car struct {
Wheel string // 车轮子
Steering string // 方向盘
Seat string // 车座椅
}
// Builder 抽象建造者接口
type Builder interface {
BuildWheel()
BuildSteering()
BuildSeat()
GetResult() Car
}
// ConcreteCar 具体建造者类
type ConcreteCar struct {
car Car
}
func (c *ConcreteCar) BuildWheel() {
c.car.Wheel = "生产轮子,使用橡胶、胶水、用模具灌溉等等。"
}
func (c *ConcreteCar) BuildSteering() {
c.car.Steering = "生产方向盘,使用模具,用塑料等产物。"
}
func (c *ConcreteCar) BuildSeat() {
c.car.Seat = "生产座椅,用吕啊钢啊布啊等等柔和而成。"
}
func (c *ConcreteCar) GetResult() Car {
return c.car
}
// Director 指导者类
type Director struct {
builder Builder
}
// Construct 指导者来组合产品属性,拼装车
func (d *Director) Construct() Car {
d.builder.BuildWheel()
d.builder.BuildSteering()
d.builder.BuildSeat()
return d.builder.GetResult()
}
测试
func TestBuilderCar(t *testing.T) {
builder := &ConcreteCar{}
director := Director{
builder: builder,
}
car := director.Construct() // 车子组装了
//打印车子的各种信息
fmt.Println(car.Wheel)
fmt.Println(car.Seat)
fmt.Println(car.Steering)
}
此例子中,
- Car就是产品Product,要构建的产品就是车。
- Builder是抽象建造者接口,定义了构建产品各个部分的抽象方法,
- ConcreteCar 是具体建造者类,实现了抽象建造者接口,负责实际构建产品的各个部分。
- Director 是指导者类,负责使用具体建造者来构建产品。
作用和场景
通过使用建造者模式,客户端可以灵活地构建不同配置的电脑产品,而无需直接关心产品的构建细节。这种方式使得产品的构建过程与产品的表示相分离,从而提高了系统的可维护性和可扩展性。
构建复杂对象
建造者模式用于构建具有多个组成部分的复杂对象,通过将对象的构建过程分解为多个步骤,使得系统能够更灵活、更方便地构建不同配置的对象。
隐藏产品的构建细节
建造者模式通过将产品的构建过程封装在具体建造者中,使得客户端无需了解产品的内部构建细节,从而实现了产品构建过程与产品的表示分离。
灵活地组装产品
建造者模式允许客户端通过不同的具体建造者组装不同的产品配置,使得构建过程更加灵活,同时客户端代码不会受到产品内部变化的影响。
建造者模式适用于构建复杂对象,特别是那些由多个部分组成的对象。例如,构建一份报告、电子商务中的购物车、具有不同配置的汽车等。当客户端不需要关心产品的具体构建过程,只需关心产品的最终表示时,建造者模式是一个合适的选择。
总的来说,建造者模式适用于需要构建复杂对象,同时希望灵活地组装不同配置的对象的情况。它有助于实现对象构建过程的分步骤、隐藏内部细节,并提供多个具体建造者以支持不同的产品表示。