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

2024-05-09 19:36
文章标签 设计模式 go 建造

本文主要是介绍go设计模式之建造者设计模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

建造者设计模式

建造者模式也叫生成器模式。

生成器模式是一种创建型设计模式, 目标是将复杂对象的构造与其表示分离,以便相同的构造过程可以创建不同的表示。

案例

igloo­Builder冰屋生成器与 normal­Builder普通房屋生成器可建造不同类型房屋, 即 igloo冰屋和 normal­House普通房屋 。 每种房屋类型的建造步骤都是相同的。 主管 (可选) 结构体可对建造过程进行组织。

iBuilder.go: 生成器接口

package maintype IBuilder interface {setWindowType()setDoorType()setNumFloor()getHouse() House
}func getBuilder(builderType string) IBuilder {if builderType == "normal" {return newNormalBuilder()}if builderType == "igloo" {return newIglooBuilder()}return nil
}

normalBuilder.go: 具体生成器

package maintype NormalBuilder struct {windowType stringdoorType   stringfloor      int
}func newNormalBuilder() *NormalBuilder {return &NormalBuilder{}
}func (b *NormalBuilder) setWindowType() {b.windowType = "Wooden Window"
}func (b *NormalBuilder) setDoorType() {b.doorType = "Wooden Door"
}func (b *NormalBuilder) setNumFloor() {b.floor = 2
}func (b *NormalBuilder) getHouse() House {return House{doorType:   b.doorType,windowType: b.windowType,floor:      b.floor,}
}

iglooBuilder.go: 具体生成器

package maintype IglooBuilder struct {windowType stringdoorType   stringfloor      int
}func newIglooBuilder() *IglooBuilder {return &IglooBuilder{}
}func (b *IglooBuilder) setWindowType() {b.windowType = "Snow Window"
}func (b *IglooBuilder) setDoorType() {b.doorType = "Snow Door"
}func (b *IglooBuilder) setNumFloor() {b.floor = 1
}func (b *IglooBuilder) getHouse() House {return House{doorType:   b.doorType,windowType: b.windowType,floor:      b.floor,}
}

house.go: 产品

package maintype House struct {windowType stringdoorType   stringfloor      int
}

director.go: 主管

package maintype Director struct {builder IBuilder
}func newDirector(b IBuilder) *Director {return &Director{builder: b,}
}func (d *Director) setBuilder(b IBuilder) {d.builder = b
}func (d *Director) buildHouse() House {d.builder.setDoorType()d.builder.setWindowType()d.builder.setNumFloor()return d.builder.getHouse()
}

main.go: 客户端代码

package mainimport "fmt"func main() {normalBuilder := getBuilder("normal")director := newDirector(normalBuilder)normalHouse := director.buildHouse()
}

总结

本案例buildHouse()的顺序是固定的,也就是说 igloo冰屋和 normal­House普通房屋 的建造顺序是一样的。

如果不同的对象有不同的构建顺序。在director中构建。

建造者模式的角色:

生成器、具体生成器、产品、导演(director,可选)、客户端。

导演类起到封装的作用,避免高层模块深入到建造者内部的实现类。

建造者关注的是零件类型和装配工艺(顺序)。工厂方法重点是创建。

建造者模式最主要的功能是基本方法的调用顺序安排。

使用场景

  • 相同的方法,不同的执行顺序,产生不同的事件结果时,可以采用建造者模式。
  • 当开发者希望创建不同形式的产品时,可以使用建造者模式。
  • 如果需要使用构造函数,并且构造函数的参数很多,可以使用建造者模式(链式调用)。

优点

  • 在建造者模式中,产品内部组成的细节对客户端不可见,将产品的创建过程和产品解耦。
  • 在生成器模式中,每个具体生成器都相对独立,方便扩展。
  • 将复杂的产品创建步骤分解在不同的方法中,使创建过程更清晰。

缺点

  • 在生成器模式中,需要为不同类型的产品创建单独的具体生成器,因此代码量较大。

这篇关于go设计模式之建造者设计模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974305

相关文章

java设计模式之工厂模式--普通工厂方法模式(Factory Method)

1.普通工厂模式,就是建立一个工厂类,对实现了同一接口的一些类进行实例的创建。 2.先定义一个接口: package com.zhong.pattern.factorymethod;/*** 发送接口* @author admin**/public interface Sender {/*** 发送消息方法* @param msg*/void send(String msg);} 3

Java设计模式之代理模式2-动态代理(jdk实现)

这篇是接着上一篇继续介绍java设计模式之代理模式。下面讲解的是jdk实现动态代理。 1.)首先我们要声明一个动态代理类,实现InvocationHandler接口 package com.zhong.pattern.proxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;/*** 演

java设计模式之代理模式1--静态代理

Java编程的目标是实现现实不能完成的,优化现实能够完成的,是一种虚拟技术。生活中的方方面面都可以虚拟到代码中。代理模式所讲的就是现实生活中的这么一个概念:助手。 代理模式的定义:给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 1.)首先新建一个表演的接口 package com.zhong.pattern.proxy;/*** 表演接口* @author admin*

java原型(Prototype)设计模式

原型模式就是讲一个对象作为原型,使用clone()方法来创建新的实例。 public class Prototype implements Cloneable{private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}@Overri

Java中23种设计模式之适配者模式

适配器模式的作用就是在原来的类上提供新功能。 主要可分为3种: 1.类适配:创建新类,继承源类,并实现新接口,例如:     class Adapter extends OldClass implements NewFunc{} 2.对象适配:创建新类持源类的实例,并实现新接口,例如:     class Adapter implements NewFunc { priva

二十、设计模式总结—后会有期 #和设计模式一起旅行#

告别 是为了下一次相遇,告别更是新的开始! 瞎扯 设计模式整了两个月了,看了一些书籍和一些博客,整体是完成了,但是还有一些模式没有总结出来,不过剩下的模式暂时不准备在更新了,剩下的也相对来说不是那么的重要! 在看设计模式的这段时间中,总是有一种感觉,看到其中的一个设计模式,有似曾相识的感觉,看完之后比较清晰了,也会想着在工作那些地方遇到了设计模式,还有就是自己在设计的时候也有一些意识,

十九、原型模式—通过复制生产实例 #和设计模式一起旅行#

拔一根猴毛,变出十万个孙悟空 故事背景 在java中,我们一般创建实例的时候可以使用了new 关键词指定类名来生成类的实例。例如: Preson p = new Person();或者Person p = Person.getInstance(); 但是是在实际开发过程中,有时候会有“不指定类名的前提下生成实例”的需求。这种情况下,就不能通过上面的这种方式生成实例! 除了上面

编译报错go: unsupported GOOS/GOARCH pair linux /amd64

目录 背景 解决 背景 在windows下交叉编译go程序,目标平台是linux、amd64。 执行指令: GOOS=linux GOARCH=amd64 go build -v或set GOOS=linux & set GOARCH=amd64 & go build -v 报错 go: unsupported GOOS/GOARCH pair linux /amd64

GO语言的一些问题

1. C++与Go语言的性能对比分析 (1) 内存管理     C++:可以手动进行内存分配和释放,精细控制内存。灵活性带来风险,如内存泄漏、野指针。     Go:自动内存管理机制,避免内存问题,降低难度。带来额外的性能开销,如垃圾回收。 (2) 编译方式     C++:静态编译,把更多的库文件链接在一起,形成一个单独的可执行文件。启动速度比较快,编译速度相对慢,生成文件比较大。

设计模式(一)-策略模式

策略模式:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 代码示例 每种类型的鸭子具有不同属性行为,我们把每种类型行为定义为接口,然后每种行为具体的类型就是实现这些接口的具体类。鸭子父类使用每种行为的接口类型来接收具体的行为类,然后调用具体行为的方法。需要更改某个具体鸭子的行为时,只需要更改注入的相关具体行为实现类 飞行行为 /***