设计模式之建造者模式

miloyang
0 评论
/ /
417 阅读
/
3226 字
20 2023-11

简介

建造者模式是一种创建型设计模式,用于构建复杂对象,该模式将一个复杂对象的构建过程和它的表示进行分离,使得同样的构建过程可以创建不同的表示。通过使用构建模式,可以逐步构建一个复杂的对象,同时使得客户端不需要知道对象的内部构建细节。

建造者模式有如下主要角色:

  • 产品 Product

    产品是要构建的复杂对象,它通常包含多个部分

  • 抽象建造者 Builder

    抽象建造者定义了创建产品各个部分的抽象方法,以及一个返回最终产品的方法

  • 具体建造者 Concreate Builder

    具体建造者实现了抽象建造者接口,负责实际构建产品的各个部分,并提供一个返回最终产品的方法。

  • 指导者 Director

    指导者负责使用建造者的接口来构建产品,它不需要知道产品的具体构建细节,只需要知道如何使用建造者来构建产品。

一般来说,建造者模式有以下步骤:

  • 定义产品的各个部分

    抽象建造者接口声明了用于构建产品的各个部分的抽象方法,以及一个返回最终产品的方法。

  • 定义抽象建造者接口

    抽象建造者接口声明了用于构建产品各个部分的抽象方法,以及一个返回最终产品的方法。

  • 实现具体建造者类

    具体建造者类实现了抽象建造者接口,负责实际构建产品的各个部分,并提供一个返回最终产品的方法

  • 定义产品类

    产品类包含各个部分的属性和方法,并提供一个用于获取产品的方法。

  • 定义指导者类

    指导者类负责使用具体构建者来构建产品,可以根据客户端的需求调用具体建造者的方法,已完成产品的构建。

jugelizi

比如我们的产品是一辆车,它有轮子、座椅、方向盘、车架等等组成,但轮子又是橡胶等等组成、椅子又有布、铁等等组成,方向盘又有七七八八的,我们如果要组成一辆车,那根本不需要关心这些布啊铁啊之类的,我们只需要根据安装说明书,去拼装出来就可以了是吧。

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 是指导者类,负责使用具体建造者来构建产品。

作用和场景

通过使用建造者模式,客户端可以灵活地构建不同配置的电脑产品,而无需直接关心产品的构建细节。这种方式使得产品的构建过程与产品的表示相分离,从而提高了系统的可维护性和可扩展性。

  • 构建复杂对象

    建造者模式用于构建具有多个组成部分的复杂对象,通过将对象的构建过程分解为多个步骤,使得系统能够更灵活、更方便地构建不同配置的对象。

  • 隐藏产品的构建细节

    建造者模式通过将产品的构建过程封装在具体建造者中,使得客户端无需了解产品的内部构建细节,从而实现了产品构建过程与产品的表示分离。

  • 灵活地组装产品

    建造者模式允许客户端通过不同的具体建造者组装不同的产品配置,使得构建过程更加灵活,同时客户端代码不会受到产品内部变化的影响。

建造者模式适用于构建复杂对象,特别是那些由多个部分组成的对象。例如,构建一份报告、电子商务中的购物车、具有不同配置的汽车等。当客户端不需要关心产品的具体构建过程,只需关心产品的最终表示时,建造者模式是一个合适的选择。

总的来说,建造者模式适用于需要构建复杂对象,同时希望灵活地组装不同配置的对象的情况。它有助于实现对象构建过程的分步骤、隐藏内部细节,并提供多个具体建造者以支持不同的产品表示。

人未眠
工作数十年
脚步未曾歇,学习未曾停
乍回首
路程虽丰富,知识未记录
   借此博客,与之共进步