造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。
当一个方法有多个变量的时候,我们在调用该方法的时候可能会因为参数的顺序、个数错误,而造成调用错误或者不能达到我们预期的目的。针对这个问题,我们的建造设计模式可以完美的解决这个问题
package builderimport "fmt"type Deployment struct { Name string // 镜像信息 Image, ContainerName string // 端口信息 SvcPort, ContainerPort int}func (d *Deployment) String() string { return fmt.Sprintf("Name:%s,Image:%s,ContainerName:%s,SvcPort:%d,ContainerPort:%d", d.Name,d.Image,d.ContainerName,d.SvcPort,d.ContainerPort)}type DeploymentBuilder struct { deployment *Deployment}// 总体deployment 工厂函数func NewDeploymentBuilder() *DeploymentBuilder { return &DeploymentBuilder{deployment: &Deployment{}}}// Deployment 镜像建造者type DeployImgBuilder struct { DeploymentBuilder}// Deployment 端口建造者type DeployPortBuilder struct { DeploymentBuilder}// 镜像建造func (d *DeploymentBuilder) imgs() *DeployImgBuilder { return &DeployImgBuilder{*d}}// 端口建造func (d *DeploymentBuilder) ports() *DeployPortBuilder { return &DeployPortBuilder{*d}}// 使用 DeployImgBuilder/DeployPortBuilder 创建一些行为/函数/方法,用于设置Deployment的属性func (d *DeploymentBuilder) Name(name string) *DeploymentBuilder { d.deployment.Name = name return d}// DeployImgBuilder 设置镜像名称func (i *DeployImgBuilder) Image(n string) *DeployImgBuilder { i.deployment.Image = n return i}// DeployImgBuilder 设置容器名称func (i *DeployImgBuilder) ContainerName(n string) *DeployImgBuilder { i.deployment.ContainerName = n return i}// DeployPortBuilder 设置svc端口func (p *DeployPortBuilder) SvcPort(o int) *DeployPortBuilder { p.deployment.SvcPort = o return p}// DeployPortBuilder 设置容器端口func (p *DeployPortBuilder) ContainerPort(o int) *DeployPortBuilder { p.deployment.ContainerPort = o return p}// 最后使用DeploymentBuilder 来返回builderfunc (b *DeploymentBuilder) build() *Deployment { return b.deployment}
package builderimport ( "fmt" "testing")func TestNewDeploymentBuilder(t *testing.T) { db := NewDeploymentBuilder() deploy := db.Name("deployname"). imgs(). ContainerName("cname"). Image("cimage"). ports(). ContainerPort(80). SvcPort(30088). build() t.Logf(deploy.String()) fmt.Println(deploy.String())}
留言与评论(共有 0 条评论) “” |