【设计模式】建造者模式

简介: 【6月更文挑战第16天】建造者模式是创建型设计模式,用于分离对象构造的步骤和其表示,允许构造多种表示。适用于构建过程复杂且部分可变的情况。关键角色包括产品、抽象建造者、具体建造者和导演。例如,汉堡套餐的组合。优点是灵活性高、隐藏构建细节,缺点是可能增加代码冗余。与工厂模式对比,更关注构建顺序。示例中展示了Go语言的建造者模式实现,用于创建`ResourcePoolConfig`,通过Builder进行参数校验和构建。

建造者模式是一种创建型设计模式,目的是将一个复杂对象的构建过程与其表示相分离,从而可以创建不同表示形式的对象。

基本介绍

意图

将一个复杂的构建过程和表示相分离,使得同样的构建过程可以创建不同的表示

适用场景

在软件系统中,一个复杂对象的创建通常由多个部分组成,这些部分的组合经常变化,但是组合的算法相对稳定。

建造者模式通过将变与不变的部分分开,来解决这个问题。

  • 类的属性比较多

  • 类的属性之间有一定的依赖关系或约束条件

  • 存在必选和非必选的属性

  • 希望创建不可变的对象

关键代码

  • 建造者:创建并提供实例

  • 导演:管理建造出来的实例的依赖关系和控制构建过程

应用实例

  • 肯德基里,汉堡、可乐、薯条、鸡翅等商品是不变的,组合是经常变化的,生成不同的套餐

  • Java的StringBuilder

优点

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。

  • 可以更好地控制构建过程,隐藏具体构建细节。

  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

缺点

  • 如果产品的属性较少,建造者模式可能会导致代码冗余。
  • 增加了系统的类和对象数量。

使用场景

  • 需要生成的对象具有复杂的内部结构。
  • 需要生成的对象内部属性相互依赖。

和工厂模式的区别:建造者模式更加关注零件装配的顺序,一般用于创建参数复杂的对象;工厂模式用于创建类型相关的不同对象

结构

主要包含下面几个主要角色

  • 产品:要构建的复杂对象,通常包含多个部分或属性

  • 抽象建造者:定义了构建产品的抽象接口,包括构建产品的各个部分的方法

  • 具体建造者:实现抽象建造者接口,具体确定如何构建产品的各个部分,并负责返回最终构建的产品

  • 指导者:负责调用建造者的方法来构建产品,不了解具体的构建过程,只关心产品的构建顺序和方式

代码实例

使用Go编写建造者模式的代码其实会很长,这是它的一个缺点,如果不是参数校验逻辑很复杂的情况下一般采用第二种方式


const (
    defaultMaxTotal = 10
    defaultMaxIdle  = 9
    defaultMinIdle  = 1
)

type ResourcePoolConfig struct {
   
    name     string
    maxTotal int
    maxIdle  int
    minIdle  int
}

// 用于构建 ResourcePoolConfig
type ResourcePoolConfigBuilder struct {
   
    name     string
    maxTotal int
    maxIdle  int
    minIdle  int
}

func (r *ResourcePoolConfigBuilder) SetName(name string) error {
   
    if len(name) == 0 {
   
        return fmt.Errorf("name can not be empty")
    }
    r.name = name
    return nil
}

func (r *ResourcePoolConfigBuilder) SetMaxTotal(maxTotal int) error {
   
    if maxTotal <= 0 {
   
        return fmt.Errorf("max total cannot <= 0, input: %d", maxTotal)
    }
    r.maxTotal = maxTotal
    return nil
}

func (r *ResourcePoolConfigBuilder) SetMaxIdle(maxIdle int) error {
   
    if maxIdle < 0 {
   
        return fmt.Errorf("max idle cannot < 0, input: %d", maxIdle)
    }
    r.maxIdle = maxIdle
    return nil
}

func (r *ResourcePoolConfigBuilder) SetMinIdle(minIdle int) error {
   
    if minIdle < 0 {
   
        return fmt.Errorf("max idle cannot < 0, input: %d", minIdle)
    }
    r.minIdle = minIdle
    return nil
}
func (b *ResourcePoolConfigBuilder) Build() (*ResourcePoolConfig, error) {
   
    if b.name == "" {
   
        return nil, fmt.Errorf("name can not be empty")
    }
    if b.minIdle == 0 {
   
        b.minIdle = defaultMinIdle
    }
    if b.maxIdle == 0 {
   
        b.maxIdle = defaultMaxIdle
    }

    if b.maxTotal == 0 {
   
        b.maxTotal = defaultMaxTotal
    }

    if b.maxTotal < b.maxIdle {
   
        return nil, fmt.Errorf("max total(%d) cannot < max idle(%d)", b.maxTotal, b.maxIdle)
    }

    if b.minIdle > b.maxIdle {
   
        return nil, fmt.Errorf("max idle(%d) cannot < min idle(%d)", b.maxIdle, b.minIdle)
    }
    return &ResourcePoolConfig{
   
        name:     b.name,
        maxTotal: b.maxTotal,
        maxIdle:  b.maxIdle,
        minIdle:  b.minIdle,
    }, nil
}

第二种方式通过可变参数的方式来传递入口的参数,感觉也很容易扩展,兼容性高

func Test_NewBuilder(t *testing.T) {
   
    opts := []ResourcePoolConfigOptFunc{
   
        func(option *ResourcePoolConfigOption) {
   
            option.maxTotal = 20
        },
    }
    config, err := NewResourcePoolConfig("test", opts...)
    if err != nil {
   
        t.Fatal(err)
    }
    t.Logf("%+v", config) //&{name:test maxTotal:20 maxIdle:9 minIdle:1}
}
目录
相关文章
|
1月前
|
设计模式 Java
【设计模式系列笔记】建造者模式
建造者模式是一种创建型设计模式,用于将复杂对象的构建与其表示分离,使构建过程可定制。关键元素包括产品类(定义要构建的对象)、建造者接口(定义构建方法)、具体建造者类(实现构建过程)和指导者类(负责构建过程)。通过建造者模式,客户端可以灵活地创建具有不同表示的复杂对象,提高代码的可读性和可维护性,尤其适用于构建过程复杂且包含多个可选部分的情况。
112 1
|
1月前
|
设计模式 安全 Java
构建未来应用:Java设计模式 - 建造者模式(Builder)在现代编程中的应用
【4月更文挑战第7天】建造者模式是提升代码质量的关键,尤其在复杂环境中。它分步骤构建对象,将构建与表示分离,适用于UI构建、数据模型组装、配置文件解析和网络请求构造等场景。最佳实践包括明确构建步骤、提供默认值、支持链式调用和确保线程安全。然而,过多步骤、不一致状态和性能问题是使用时需注意的问题。掌握建造者模式对于现代编程至关重要。
|
1月前
|
设计模式 Java 机器人
Java设计模式-建造者模式
建造者(Builder)模式指将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。它是把对象的构建和表述分离。
62 0
Java设计模式-建造者模式
|
1月前
|
设计模式
设计模式 | 建造者模式
设计模式 | 建造者模式
38 0
|
1月前
|
设计模式 Go 开发工具
Golang设计模式——04建造者模式
Golang设计模式——04建造者模式
31 0
|
22小时前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
4 1
|
1月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
23 1
大话设计模式(3)——造物者一般的建造者模式
|
6天前
|
设计模式
创建型设计模式之建造者模式
创建型设计模式之建造者模式
|
1月前
|
设计模式 测试技术 Go
[设计模式 Go实现] 创建型~建造者模式
[设计模式 Go实现] 创建型~建造者模式
|
1月前
|
设计模式 JavaScript 前端开发
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式
[设计模式Java实现附plantuml源码~创建型] 复杂对象的组装与创建——建造者模式