Go 设计模式-建造者模式

简介: Go 设计模式-建造者模式

设计模式

image.png

建造者模式


工厂模式用来创建不同、但是类型相关类型的对象(继承同一父类或者接口的一组子类),由给定的参数来决定哪种类型的对象,建造者模式是用来构建一种复杂对象,可以通过设置不同的可选参数,定制化创建不同的对象,

应用场景


  • 把类的必填属性放在构造函数中,强制创建的时候设置,如果必填属性很多,这些必填属性都需要放到构造函数中设置,那构造函数就会出现参数列表很长的问题。如果我们把必填属性通过 set() 方法设置,那校验这些属性是否填写的逻辑又无处安放。
  • 如果类属性之间有一定的依赖关系或者约束条件,我们继续用构造函数配合 set() 方法设计思路,那这些依赖关系或者约束条件又无处安放。
  • 如果我们希望创建不可变对象,也就是说,对象在创建好之后,就不能再修改内部的属性值,要实现这个功能,就不能暴露 set 方法,构造函数配合 set() 方法就不合适了。

代码例子


builder.go

package builder
//Builder 生成器接口
type Builder interface {
 Part1()
 Part2()
 Part3()
}
type Director struct {
 builder Builder
}
// NewDirector ...
func NewDirector(builder Builder) *Director {
 return &Director{
  builder: builder,
 }
}
//Construct Product
func (d *Director) Construct() {
 d.builder.Part1()
 d.builder.Part2()
 d.builder.Part3()
}
type Builder1 struct {
 result string
}
func (b *Builder1) Part1() {
 b.result += "1"
}
func (b *Builder1) Part2() {
 b.result += "2"
}
func (b *Builder1) Part3() {
 b.result += "3"
}
func (b *Builder1) GetResult() string {
 return b.result
}
type Builder2 struct {
 result int
}
func (b *Builder2) Part1() {
 b.result += 1
}
func (b *Builder2) Part2() {
 b.result += 2
}
func (b *Builder2) Part3() {
 b.result += 3
}
func (b *Builder2) GetResult() int {
 return b.result
}


builder_test.go


package builder
import "testing"
func TestBuilder1(t *testing.T) {
 builder := &Builder1{}
 director := NewDirector(builder)
 director.Construct()
 res := builder.GetResult()
 if res != "123" {
  t.Fatalf("Builder1 fail expect 123 acture %s", res)
 }
}
func TestBuilder2(t *testing.T) {
 builder := &Builder2{}
 director := NewDirector(builder)
 director.Construct()
 res := builder.GetResult()
 if res != 6 {
  t.Fatalf("Builder2 fail expect 6 acture %d", res)
 }
}


再看个例子


type Options struct {
 ConnTimeout time.Duration
 ReadTimeout time.Duration
 RetryTime   int32
}
// builder 模式
func (opt *Options) build() (err error) {
 // 校验逻辑
 if opt.ReadTimeout < opt.ConnTimeout {
  err = errors.New("error params")
  return
 }
 return
}
// 设置属性 ConnTimeOut
func (opt *Options) setConnTimeout(timeout time.Duration) *Options {
 opt.ConnTimeout = timeout
 return opt
}
// 设置属性 ReadTimeOut
func (opt *Options) setReadTimeout(timeout time.Duration) *Options {
 opt.ReadTimeout = timeout
 return opt
}
// 设置属性 retryTime
func (opt *Options) setRetryTime(times int32) *Options {
 opt.RetryTime = times
 return opt
}


builder_test.go


package main
import "testing"
func Build() {
 opt := &Options{}
 err := opt.
  setConnTimeout(100 * time.Second).
  setReadTimeout(1000 * time.Second).
  setRetryTime(1).
  build()
 if err != nil {
  panic(err)
 }
 fmt.Printf("BuildV1: %+v\n", opt)
}
func TestAppDemo(t *testing.T) {
 Build()
}
相关文章
|
2月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
10天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
4月前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
72 8
|
5月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
|
6月前
|
设计模式 uml
大话设计模式(3)——造物者一般的建造者模式
大话设计模式(3)——造物者一般的建造者模式
43 1
大话设计模式(3)——造物者一般的建造者模式
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
51 0
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)