一起学习 Go 语言设计模式之建造者模式(上)

简介: 在设计模式中,建造者模式就是解决如何将这些部件组装成一辆完整的汽车并返回给用户的设计模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。

前言

你去买车,你不会只买一个轮胎、一个发动机、一个方向盘,你买的是一辆包括轮胎、方向盘、发动机、底盘、电气系统和车身等多个部件组成的完整骑车。


在设计模式中,建造者模式就是解决如何将这些部件组装成一辆完整的汽车并返回给用户的设计模式。建造者模式为客户端返回的不是一个简单的产品,而是一个由多个部件组成的复杂产品。

思考如下问题

假设让我们思考如何创建一个房屋对象。建造一栋简单的房屋,你需要建造地板和四面的强,安装房门和窗户,然后再建造一个漂亮的屋顶。


但如果想要一个更宽敞舒适的别墅,还需要有院子、游泳池、植物和其他设施(例如中央空调、排水、供电设备),那又该怎么办呢?


image.png


最简单的方法就是扩展房屋的积累,然后创建一系列涵盖所有参数组合的子类。随着房子越复杂,子类越多,任何新增的参数都会让这个层次结构更加复杂。


image.png


另外一种方式则无需生成子类,我们可以在房屋基类中创建一个包含所有可能参数的超级构造函数,并用它来控制房屋对象,这种方法确实可以避免生成子类,但它却会造成另外一个问题——构造函数参数太多。

House(windows, doors, rooms, hasSwimPool, hasGarden,...)


但并不是所有的房子都需要游泳池,导致绝大部分的参数都没有使用,使得构造函数的声明复杂,调用不整洁


解决方式就是今天要介绍的建造者模式。

建造者模式概念

建造者模式(Builder Pattern),又称生成器模式,是较为复杂的创建者模式,它将客户端与包含多个组成部分的复杂对象的创建过程分离,客户端无需知道复杂对象的内部组成部分与装配方式,只需要知道所需的建造者类型即可。


定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。


结构图如下:


image.png


由上图可以知道,建造者模式包含 4 个角色:


  • Builder 抽象建造者:它为创建一个产品 Product 对象的各个部件指定抽象接口,这个接口一般包括两类方法:
  • buildPartX() :用于创建复杂对象的各个部件
  • getResult() :用于返回复杂对象
  • ConcreteBuilder 具体建造者:它实现了 Builder 接口,实现各个部件的具体构造和装配方法,定义并明确其所创建的复杂对象,也可以提供一个方法返回创建好的复杂产品对象
  • Product 产品角色:它是最终被构建的复杂对象,包含多个组成部件,具体建造者创建该产品的内部表示并定义其装配过程。
  • Director 主管、指挥者:指挥者又被称为导演类,定义调用构造步骤的顺序。它负责安排负责对象的建造次序,指挥者和抽象建造者之间存在关联关系,可以在其 construct() 建造方法中调用建造者对象的部件构造与装配方法,完成负责对象的建造。
相关文章
|
8天前
|
JSON 中间件 Go
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
|
12天前
|
程序员 Go 云计算
2023年学习Go语言是否值得?探索Go语言的魅力
2023年学习Go语言是否值得?探索Go语言的魅力
|
5天前
|
算法 NoSQL 中间件
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。
go语言后端开发学习(六) ——基于雪花算法生成用户ID
|
6天前
|
JSON 缓存 监控
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
|
17天前
|
Go
Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法
Go - 学习 grpc.Dial(target string, opts …DialOption) 的写法
40 12
|
12天前
|
SQL 关系型数据库 MySQL
「Go开源」goose:深入学习数据库版本管理工具
「Go开源」goose:深入学习数据库版本管理工具
「Go开源」goose:深入学习数据库版本管理工具
|
13天前
|
设计模式 Go
go 设计模式之观察者模式
go 设计模式之观察者模式
|
1月前
|
Cloud Native Java Go
为什么要学习Go语言?
GO logo的核心理念,即简单胜于复杂。使用现代斜体无衬线字体与三条简单的运动线相结合,形成一个类似于快速运动的两个轮子的标记,传达速度和效率。字母的圆形暗示了GO地鼠的眼睛,创造了一个熟悉的形状,让标记和吉祥物很好地搭配在一起。
38 4
|
1月前
|
设计模式 Go
Go语言设计模式:使用Option模式简化类的初始化
在Go语言中,面对构造函数参数过多导致的复杂性问题,可以采用Option模式。Option模式通过函数选项提供灵活的配置,增强了构造函数的可读性和可扩展性。以`Foo`为例,通过定义如`WithName`、`WithAge`、`WithDB`等设置器函数,调用者可以选择性地传递所需参数,避免了记忆参数顺序和类型。这种模式提升了代码的维护性和灵活性,特别是在处理多配置场景时。
54 8
|
1月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
22 0