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

相关文章

go中的时间处理过程

《go中的时间处理过程》:本文主要介绍go中的时间处理过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 获取当前时间2 获取当前时间戳3 获取当前时间的字符串格式4 相互转化4.1 时间戳转时间字符串 (int64 > string)4.2 时间字符串转时间

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中