设计模式--建造者(Builder)模式

模式定义

将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示

类图

在这里插入图片描述

应用场景

1.需要生成的对象具有复杂的内部结构;

2.需要生成的对象内部属性本身相互依赖;

3.与不可变对象配合使用;

优点

1.建造者独立,易扩展;

2.便于控制细节风险;

要点总结

  • Builder模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化
  • 变化点在哪里,封装哪里----Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动,其缺点在于难以应对“分步骤构建算法”的需求变动

Go语言代码实现

建造者模式(Builder Pattern)是一种创建型设计模式,它允许你按照步骤构建复杂对象。建造者模式将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。

建造者模式适用于需要创建具有多个组件或参数的复杂对象,并且需要灵活地构建不同表示的对象。它将构建过程分解为一系列步骤,并使用一个指导者(Director)来协调这些步骤,最终构建出一个完整的对象。

以下是使用Golang实现建造者模式的示例代码:

package main

import "fmt"

// Product 产品结构
type Product struct {
	partA string
	partB string
	partC string
}

// Builder 建造者接口
type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
	GetResult() Product
}

// ConcreteBuilder 具体建造者
type ConcreteBuilderA struct {
	product Product
}

func (b *ConcreteBuilderA) BuildPartA() {
	b.product.partA = "Part A"
}

func (b *ConcreteBuilderA) BuildPartB() {
	b.product.partB = "Part B"
}

func (b *ConcreteBuilderA) BuildPartC() {
	b.product.partC = "Part C"
}

func (b *ConcreteBuilderA) GetResult() Product {
	return b.product
}

// ConcreteBuilder 具体建造者
type ConcreteBuilderB struct {
	product Product
}

func (b *ConcreteBuilderB) BuildPartA() {
	b.product.partA = "Part A"
}

func (b *ConcreteBuilderB) BuildPartB() {
	b.product.partB = "Part B"
}

func (b *ConcreteBuilderB) BuildPartC() {
	b.product.partC = "Part C"
}

func (b *ConcreteBuilderB) GetResult() Product {
	return b.product
}
// Director 指导者
type Director struct {
	builder Builder
}

func (d *Director) Construct() Product {
	d.builder.BuildPartA()
	d.builder.BuildPartB()
	d.builder.BuildPartC()
	return d.builder.GetResult()
}

func main() {
	builderA := &ConcreteBuilderA{}  // 创建具体建造者A
	director := &Director{builderA} // 创建指导者,并将建造者传递给指导者

	productA := director.Construct() // 指导者构建产品

	fmt.Println("ProductA Part A:", productA.partA)
	fmt.Println("ProductA Part B:", productA.partB)
	fmt.Println("ProductA Part C:", productA.partC)
	
	builderB := &ConcreteBuilderB{}  // 创建具体建造者B
	director := &Director{builderB} // 创建指导者,并将建造者传递给指导者

	productB := director.Construct() // 指导者构建产品

	fmt.Println("ProductB Part A:", productB.partA)
	fmt.Println("ProductB Part B:", productB.partB)
	fmt.Println("ProductB Part C:", productB.partC)
}

在上述示例中,我们定义了一个Product结构,它表示最终构建出的产品。然后,我们定义了一个Builder接口,其中包含了构建产品的各个步骤,以及获取最终产品的方法。ConcreteBuilder是具体的建造者,它实现了Builder接口中的方法,并负责构建产品的不同部分。

Director是指导者,它接收一个具体的建造者,并通过调用建造者的方法来按照一定的顺序构建产品。最后,我们在main函数中创建一个具体的建造者和指导者,并调用指导者的Construct方法来构建产品。最终,我们打印出产品的各个部分来验证建造者模式的实现。

这样,建造者模式可以使你通过一系列步骤构建复杂的对象,同时将构建过程与最终产品的表示分离,使得相同的构建过程可以创建不同的表示。

建造者设计模式和模板方法设计模式的异同点

建造者设计模式(Builder Pattern)和模板方法设计模式(Template Method Pattern)是两种不同的设计模式,它们在对象构建和行为定义方面有一些异同点。

异同点如下:

目的和关注点:
    建造者设计模式的目的是将复杂对象的构建过程与其表示分离,通过一系列步骤逐步构建对象。它关注对象的构建过程和构建步骤的组合。
    模板方法设计模式的目的是定义一个算法的骨架,将具体步骤的实现延迟到子类中。它关注算法的定义和具体步骤的扩展。

类型:
    建造者设计模式是创建型设计模式,主要用于构建复杂对象。
    模板方法设计模式是行为型设计模式,主要用于定义算法的骨架。

使用方式:
    建造者设计模式使用一系列步骤来构建对象,每个步骤由具体的建造者实现,最终由指导者进行协调和返回构建的对象。
    模板方法设计模式定义一个算法的骨架,其中某些步骤由父类定义并实现,而某些步骤由子类具体实现。

关注点的差异:
    建造者设计模式关注的是对象的构建过程和步骤的组合,强调构建对象的灵活性和可定制性。
    模板方法设计模式关注的是定义算法的骨架和步骤的扩展,强调算法的复用和步骤的统一性。

虽然建造者设计模式和模板方法设计模式在目的、使用方式和关注点上有差异,但它们都有助于提高代码的可维护性、扩展性和复用性。具体使用哪种设计模式取决于需求和场景的不同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值