第8节 建造者模式


❤️💕💕Java和Golang的设计模式,设计模式介绍、创建者模式、结构型模式、行为型模式。Myblog:http://nsddd.topopen in new window


[TOC]

建造者模式定义

建造者模式是一种创建者设计模式,它允许您创建具有不同配置的对象。这可以通过将对象的构造细节隐藏在一个单独的对象中来实现,该对象负责确定应该使用哪些参数,并返回正确配置的对象。

在Go语言中,可以使用类似于以下示例代码的结构实现建造者模式:

type Person struct {
    FirstName string
    LastName  string
    Age       int
}

type PersonBuilder struct {
    person Person
}

func (pb *PersonBuilder) SetFirstName(firstName string) *PersonBuilder {
    pb.person.FirstName = firstName
    return pb
}

func (pb *PersonBuilder) SetLastName(lastName string) *PersonBuilder {
    pb.person.LastName = lastName
    return pb
}

func (pb *PersonBuilder) SetAge(age int) *PersonBuilder {
    pb.person.Age = age
    return pb
}

func (pb *PersonBuilder) Build() *Person {
    return &pb.person
}

在此示例中,PersonBuilder 结构用于存储正在构建的 Person 对象,以及设置其属性值的方法。每个方法都返回 *PersonBuilder,这使得可以方便地链式调用多个方法,以在单个语句中设置多个属性。

最后,Build 方法返回正确配置的 Person 对象的指针。这使得可以使用单个表达式创建并初始化 Person 对象,如下所示:

person := PersonBuilder{}.
    SetFirstName("John").
    SetLastName("Doe").
    SetAge(30).
    Build()

使用此方法,可以使用清晰明了的语法创建和配置复杂的对象。

完整代码

以下是用 Go语言 编译出来的完整代码如下:

package main

import "fmt"

type Person struct {
    FirstName string
    LastName  string
    Age       int
}

type PersonBuilder struct {
    person Person
}

func (pb *PersonBuilder) SetFirstName(firstName string) *PersonBuilder {
    pb.person.FirstName = firstName
    return pb
}

func (pb *PersonBuilder) SetLastName(lastName string) *PersonBuilder {
    pb.person.LastName = lastName
    return pb
}

func (pb *PersonBuilder) SetAge(age int) *PersonBuilder {
    pb.person.Age = age
    return pb
}

func (pb *PersonBuilder) Build() *Person {
    return &pb.person
}

func main() {
    // 创建并初始化 Person 对象
    person := PersonBuilder{}.
        SetFirstName("John").
        SetLastName("Doe").
        SetAge(30).
        Build()

    fmt.Println(person.FirstName, person.LastName, "is", person.Age, "years old.")
}

为什么要使用构建者模式

使用构建者模式可以更好的帮助我们管理代码,所以,有以下的优点:

简化对象创建流程

在创建复杂对象时,有时需要执行多个步骤,例如设置属性或调用其他方法。使用构建者模式可以将这些步骤封装到单独的对象中,从而简化对象创建流程。

隐藏对象创建过程

通过将对象的创建细节隐藏在一个单独的对象中,构建者模式可以降低耦合度并提高代码的可维护性。

允许更好的控制对象创建

使用构建者模式,您可以指定要创建的对象的属性和配置选项。这使得可以轻松地扩展和修改对象创建过程。

支持链式调用

使用构建者模式可以支持链式调用语法,这使得可以在单个表达式中设置多个属性或调用多个方法。

深入刨析建造者模式

建造者模式很简单,但是在合适的场景中选择并且使用很难。

它可以将复杂的对象的构建过程与表示分离开来,使得构建过程可以有不同的表示。

简单来说,构建者模式就是将一个复杂的对象的构建过程封装起来,使得这个过程可以有不同的表示方法。

package main

import "fmt"

type Person struct {
    FirstName string
    LastName  string
    Age       int
}

type Builder interface {
    SetFirstName(firstName string) Builder
    SetLastName(lastName string) Builder
    SetAge(age int) Builder
    Build() *Person
}

type PersonBuilder struct {
    person Person
}

func (pb *PersonBuilder) SetFirstName(firstName string) Builder {
    pb.person.FirstName = firstName
    return pb
}

func (pb *PersonBuilder) SetLastName(lastName string) Builder {
    pb.person.LastName = lastName
    return pb
}

func (pb *PersonBuilder) SetAge(age int) Builder {
    pb.person.Age = age
    return pb
}

func (pb *PersonBuilder) Build() *Person {
    return &pb.person
}

func main() {
    // 创建并初始化 Person 对象
    person := (&PersonBuilder{}).
        SetFirstName("John").
        SetLastName("Doe").
        SetAge(30).
        Build()

    fmt.Println(person.FirstName, person.LastName, "is", person.Age, "years old.")
}

END 链接