go设计模式之建造者设计模式

发布于:2024-05-10 ⋅ 阅读:(29) ⋅ 点赞:(0)

建造者设计模式

建造者模式也叫生成器模式。

生成器模式是一种创建型设计模式, 目标是将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。

案例

igloo­Builder冰屋生成器与 normal­Builder普通房屋生成器可建造不同类型房屋, 即 igloo冰屋和 normal­House普通房屋 。 每种房屋类型的建造步骤都是相同的。 主管 (可选) 结构体可对建造过程进行组织。

iBuilder.go: 生成器接口

package main

type IBuilder interface {
    setWindowType()
    setDoorType()
    setNumFloor()
    getHouse() House
}

func getBuilder(builderType string) IBuilder {
    if builderType == "normal" {
        return newNormalBuilder()
    }

    if builderType == "igloo" {
        return newIglooBuilder()
    }
    return nil
}

normalBuilder.go: 具体生成器

package main

type NormalBuilder struct {
    windowType string
    doorType   string
    floor      int
}

func newNormalBuilder() *NormalBuilder {
    return &NormalBuilder{}
}

func (b *NormalBuilder) setWindowType() {
    b.windowType = "Wooden Window"
}

func (b *NormalBuilder) setDoorType() {
    b.doorType = "Wooden Door"
}

func (b *NormalBuilder) setNumFloor() {
    b.floor = 2
}

func (b *NormalBuilder) getHouse() House {
    return House{
        doorType:   b.doorType,
        windowType: b.windowType,
        floor:      b.floor,
    }
}

iglooBuilder.go: 具体生成器

package main

type IglooBuilder struct {
    windowType string
    doorType   string
    floor      int
}

func newIglooBuilder() *IglooBuilder {
    return &IglooBuilder{}
}

func (b *IglooBuilder) setWindowType() {
    b.windowType = "Snow Window"
}

func (b *IglooBuilder) setDoorType() {
    b.doorType = "Snow Door"
}

func (b *IglooBuilder) setNumFloor() {
    b.floor = 1
}

func (b *IglooBuilder) getHouse() House {
    return House{
        doorType:   b.doorType,
        windowType: b.windowType,
        floor:      b.floor,
    }
}

house.go: 产品

package main

type House struct {
    windowType string
    doorType   string
    floor      int
}

director.go: 主管

package main

type Director struct {
    builder IBuilder
}

func newDirector(b IBuilder) *Director {
    return &Director{
        builder: b,
    }
}

func (d *Director) setBuilder(b IBuilder) {
    d.builder = b
}

func (d *Director) buildHouse() House {
    d.builder.setDoorType()
    d.builder.setWindowType()
    d.builder.setNumFloor()
    return d.builder.getHouse()
}

main.go: 客户端代码

package main

import "fmt"

func main() {
    normalBuilder := getBuilder("normal")
    director := newDirector(normalBuilder)
    normalHouse := director.buildHouse()
}

总结

本案例buildHouse()的顺序是固定的,也就是说 igloo冰屋和 normal­House普通房屋 的建造顺序是一样的。

如果不同的对象有不同的构建顺序。在director中构建。

建造者模式的角色:

生成器、具体生成器、产品、导演(director,可选)、客户端。

导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。

建造者关注的是零件类型和装配工艺(顺序)。工厂方法重点是创建。

建造者模式最主要的功能是基本方法的调用顺序安排。

使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
  • 当开发者希望创建不同形式的产品时,可以使用建造者模式。
  • 如果需要使用构造函数,并且构造函数的参数很多,可以使用建造者模式(链式调用)。

优点

  • 在建造者模式中,产品内部组成的细节对客户端不可见,将产品的创建过程和产品解耦。
  • 在生成器模式中,每个具体生成器都相对独立,方便扩展。
  • 将复杂的产品创建步骤分解在不同的方法中,使创建过程更清晰。

缺点

  • 在生成器模式中,需要为不同类型的产品创建单独的具体生成器,因此代码量较大。

网站公告

今日签到

点亮在社区的每一天
去签到