Golang设计模式之建造者(生成器)模式

一 建造者模式简介¶

造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。建造者模式属于对象创建型模式。根据中文翻译的不同,建造者模式又可以称为生成器模式。

当一个方法有多个变量的时候,我们在调用该方法的时候可能会因为参数的顺序、个数错误,而造成调用错误或者不能达到我们预期的目的。针对这个问题,我们的建造设计模式可以完美的解决这个问题

二 代码¶

2.1 开发代码¶

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}

2.2 测试¶

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())}

三 应用场景¶

  • 需要生成的产品对象有复杂的内部结构,这些产品对象通常包含多个成员属性。
  • 需要生成的产品对象的属性相互依赖,需要指定其生成顺序。
  • 对象的创建过程独立于创建该对象的类。在建造者模式中引入了指挥者类,将创建过程封装在指挥者类中,而不在建造者类中。
  • 隔离复杂对象的创建和使用,并使得相同的创建过程可以创建不同的产品。

四 特点¶

4.1 优点¶

  • 生成不同形式的产品时, 你可以复用相同的制造代码。
  • 你可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。
  • 单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。

4.2 缺点¶

  • 由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章