专栏首页程序员财富自由之路Go 设计模式-建造者模式

Go 设计模式-建造者模式

设计模式

建造者模式

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

应用场景

  • 把类的必填属性放在构造函数中,强制创建的时候设置,如果必填属性很多,这些必填属性都需要放到构造函数中设置,那构造函数就会出现参数列表很长的问题。如果我们把必填属性通过 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()
}

参考资料

  • https://github.com/senghoo/golang-design-pattern

本文分享自微信公众号 - 程序员财富自由之路(gh_016ffe40d550),作者:猿星人

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    func NewBuilder(build Builder) *Director {

    暮雨
  • 设计模式:建造者模式

    在生活中存在很多复杂的对象,就拿我们每天都见到的汽车举例,它由轮胎、方向盘、发动机、外壳等各种部件组成的,可谓是相当复杂。

    王强
  • 设计模式 - 建造者模式

    建建:这场疫情啊,让我明白了,有一个房子,能让你稳定住所;有一辆车,能让你出行无忧。

    子乾建建-Jeff
  • 设计模式-建造者模式

    建造者模式属于创建型模式,将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。用于专门创建个性化的对象。区别于工厂,每个工厂生产出...

    逍遥壮士
  • 【设计模式-建造者模式】

    将一个复杂对象分解成多个相对简单的部分,然后根据不同需要分别创建它们,最后构建成该复杂对象。

    Liusy
  • 设计模式 | 建造者模式

    这个设计模式主要是解决复杂对象的创建问题, 使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

    憧憬博客
  • 设计模式-建造者模式

    用户5927264
  • 设计模式——建造者模式

    设计模式——建造者模式

    Java架构师必看
  • 设计模式之建造者【设计模式】

    建造者模式   建造者模式,顾名思义的就是类似建房子,有一个固定的流程。在大话设计模式中,作者举了一个例子大概意思是同一道菜在中国的每一个地方都有不同的味道(L...

    简单的程序员
  • java设计模式-建造者模式

    三哥
  • 设计模式之建造者模式

    tanoak
  • 【php设计模式】建造者模式

    我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite...

    码缘
  • 设计模式之建造者模式

    作为一名码农,最难得的应该就是找对象了,就算勉强找到了,要是对人家不好,人家可就离你远去了。所以要对人家好点,学会做饭,多弄几个花样出来,让生活充满新鲜感,小两...

    Edison.Ma
  • 设计模式(十):建造者模式

    在软件系统开发过程中,我们常常会需要一个创建过程复杂的对象,这个复杂的对象由多个子部件按照指定的步骤组合而成。由于需求的变化,这个复杂的对象各个部分经常面临着变...

    xujjj
  • python设计模式-建造者模式

    Pizza 的制作流程包括:准备(擀面皮、加佐料),然后烘烤、切片、装盒。这些有特定的顺序,不能错乱。

    goodspeed
  • 04 设计模式 建造者模式

    shimeath
  • 设计模式(四):建造者模式

    设计模式(四):建造者模式

    Java架构师必看
  • 设计模式-创建型模式-建造者模式

    建造者模式即生成器模式,将一个复杂的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    mySoul
  • 6.设计模式--建造者模式(Builder模式)

    举个例子:比如我要写一本书那么写这个书需要书名、作者、标题、内容等,但是这本书要创作完成需要一个人来创作吧,当然这个人就是作者,也可能不是(比如蹭书的编写作...

    大猫的Java笔记

扫码关注云+社区

领取腾讯云代金券