目录

建造者模式(Builder Pattern)

建造者模式的核心角色

优缺点

使用场景

注意事项

代码实现


建造者模式(Builder Pattern)

建造者模式(Builder Pattern)是将一个复杂对象构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

建造者模式的核心角色

1、抽象建造者(Builder):是为创建一个Product对象的各个部件指定的抽象接口。

2、具体建造者(ConcreteBuilder):实现Builder接口,构造和装配各个部件。

3、指挥者(Director):是构建一个实用Builder接口的对象。一方面它隔离了客户与生产过程;另一方面它负责控制产品的生成过程。

4、产品角色(Product):具体的产品

优缺点

(1)优点:

  • 分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
  • 可以更好地控制构建过程,隐藏具体构建细节。
  • 代码复用性高,可以在不同的构建过程中重复使用相同的建造者。

(2)缺点:

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

使用场景

建造者模式在创建复杂对象时非常有用,特别是当对象的构建过程涉及多个步骤或参数时。它可以提供更好的灵活性和可维护性,同时使得代码更加清晰可读。

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

注意事项

与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

代码实现

package mainimport ("errors""fmt")// Product内的参数type ResourceParams struct {name stringmaxTotal int64maxIdleint64minIdleint64}// Product接口type ResourceProduct interface {show()}// 实际Product,有show函数type RedisResourceProduct struct {resourceParams ResourceParams}// show成员函数,用于显示product的参数内容func (p *RedisResourceProduct) show() {fmt.Printf("Product的数据为 %+v ", p.resourceParams)}// 资源类创建接口type ResourceBuilder interface {setName(name string) ResourceBuildersetMaxTotal(maxTotal int64) ResourceBuildersetMaxIdle(maxIdle int64) ResourceBuildersetMinIdle(minIdle int64) ResourceBuildergetError() errorbuild() (p ResourceProduct)}// 实际建造者type RedisResourceBuilder struct {resourceParams ResourceParamserrerror}// 设置名称func (r *RedisResourceBuilder) setName(name string) ResourceBuilder {if name == "" { r.err = errors.New("name为空") return r}r.resourceParams.name = namefmt.Println("RedisResourceBuilder setName ", name)return r}// 设置maxTotal值,值不能小于0func (r *RedisResourceBuilder) setMaxTotal(maxTotal int64) ResourceBuilder {if maxTotal <= 0 { r.err = errors.New("maxTotal小于0") return r}r.resourceParams.maxTotal = maxTotalfmt.Println("RedisResourceBuilder setMaxTotal ", maxTotal)return r}// 设置maxIdle值,值不能小于0func (r *RedisResourceBuilder) setMaxIdle(maxIdle int64) ResourceBuilder {if maxIdle <= 0 { r.err = errors.New("maxIdle小于0") return r}r.resourceParams.maxIdle = maxIdlefmt.Println("RedisResourceBuilder setMaxIdle ", maxIdle)return r}// 设置minIdle值,值不能小于0func (r *RedisResourceBuilder) setMinIdle(minIdle int64) ResourceBuilder {if minIdle  r.resourceParams.maxTotal { r.err = errors.New("maxIdle > maxTotal") return}if r.resourceParams.minIdle > r.resourceParams.maxTotal || r.resourceParams.minIdle > r.resourceParams.maxIdle { r.err = errors.New("minIdle > maxTotal|maxIdle") return}fmt.Println("RedisResourceBuilder build")product := &RedisResourceProduct{ resourceParams: r.resourceParams,}return product}// 指挥者type Director struct {}// 指挥者控制建造过程func (d *Director) construct(builder ResourceBuilder) ResourceProduct {resourceProduct := builder.setName("redis"). setMinIdle(10). setMaxIdle(10). setMaxTotal(20). build()err := builder.getError()if err != nil { fmt.Println("构建失败,原因为" + err.Error()) return nil}return resourceProduct}func main() {builder := &RedisResourceBuilder{}director := &Director{}product := director.construct(builder)if product == nil { return}product.show()}