当前位置: 首页 > 科技观察

Go的开源库和大型项目的publicpackage都使用builderpattern

时间:2023-03-12 04:07:06 科技观察

builderpattern,有的翻译成generatorpattern。看了就知道是同一个东西,都是从BuilderPattern翻译过来的。.它是一种对象构造模式,将复杂对象的构造与其表示分离,使得相同的构造过程可以创建不同的表示。那么什么情况下适合使用构建模式呢?当要构建的对象很大并且需要多个步骤时,使用构建器模式有助于减小构造函数的大小。我们先看看其他语言中的Builder,再看看在Go中如何使用它来做个对比。JavaBuilder如果你编写过Java程序,那么你一定熟悉下面的代码。Coffee.builder().name("Latti").price("30").build()当然如果自己给Coffee类添加构建模式,还是需要额外写很多代码,你必须向Coffee类添加静态内部类CoffeeBuilder使用CoffeeBuilder来构建Coffee类的对象。类和静态内部类是不是傻傻的混淆了?大家可以看看小弟的Java文广汇。面向对象的基础是做不了项目的,还得掌握这些高深的知识。但是,Java中有一个lombok包。只需要导入这个包,在实体类上加上@Builder注解就可以使用了。构建模式构建对象。importlombok.Builder;@BuilderpublicclassCoffeeextendsBaseEntityimplementsSerializable{privateStringname;私人长价;......}如何在Go中使用Builder实现Go中的Builder模式?按照上面的模式,我们可以这样做:假设我们要在项目中建立一个DB连接池,连接池提供了很多配置参数。typeDBPoolstruct{dsnstringmaxOpenConnintmaxIdleConnint...maxConnLifeTimetime.Duration}我们在DB连接池中加入了builder模式,这样我们在设置每一个配置参数的时候就可以一步到位的检查参数,避免直接newConnectpool对象,然后在给每个属性赋值的时候加上判断,把每个参数的验证都凝聚到参数自己的builder步骤中。typeDBPoolBuilderstruct{DBPoolerrerror}funcBuilder()*DBPoolBuilder{b:=new(DBPoolBuilder)//设置DBPool属性的默认值b.DBPool.dsn="127.0.0.1:3306"b.DBPool.maxConnLifeTime=1*time.Secondb.DBPool.maxOpenConn=30returnb}func(b*DBPoolBuilder)DSN(dsnstring)*DBPoolBuilder{ifb.err!=nil{returnb}ifdsn==""{b.err=复制代码fmt.Errorf("无效dsn,当前为%s",dsn)}b.DBPool.dsn=dsnreturnb}func(b*DBPoolBuilder)MaxOpenConn(connNumint)*DBPoolBuilder{ifb.err!=nil{returnb}ifconnNum<1{b.err=fmt.Errorf("无效的MaxOpenConn,当前为%d",connNum)}b.DBPool.maxOpenConn=connNumreturnb}func(b*DBPoolBuilder)MaxConnLifeTime(lifeTimetime.Duration)*DBPoolBuilder{ifb.err!=nil{returnb}iflifeTime<1*time.Second{b.err=fmt.Errorf("connectionmaxlifetimecannotlitte超过1秒,当前为%v",lifeTime)}b.DBPool.maxConnLifeTime=lifeTimereturnb}func(b*DBPoolBuilder)Build()(*DBPool,error){ifb.err!=nil{returnnil,b.err}ifb.DBPool.maxOpenConn