go 生成器模式的具体使用

 更新时间:2024年01月25日 15:22:36   作者:ldxxxxll  
生成器是一种创建型设计模式,使你能够分步骤创建复杂对象,本文主要介绍了go生成器模式的具体使用,具有一定的参考价值,感兴趣的可以了解一下

生成器模式

生成器模式建议将对象构造代码从产品类中抽取出来, 并将其放在一个名为生成器的独立对象中。

模型说明

  • 生成器 (Builder) 接口声明在所有类型生成器中通用的产品构造步骤。
  • 具体生成器 (Concrete Builders) 提供构造过程的不同实现。 具体生成器也可以构造不遵循通用接口的产品。
  • 产品 (Products) 是最终生成的对象。 由不同生成器构造的产品无需属于同一类层次结构或接口。
  • 主管 (Director) 类定义调用构造步骤的顺序, 这样你就可以创建和复用特定的产品配置。
  • 客户端 (Client) 必须将某个生成器对象与主管类关联。 一般情况下, 你只需通过主管类构造函数的参数进行一次性关联即可。 此后主管类就能使用生成器对象完成后续所有的构造任务。 但在客户端将生成器对象传递给主管类制造方法时还有另一种方式。 在这种情况下, 你在使用主管类生产产品时每次都可以使用不同的生成器。

优缺点

1.优点

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

2.缺点

  • 由于该模式需要新增多个类,因此代码整体复杂程度会有所增加。

使用场景

  • 使用生成器模式可避免“重叠构造函数(telescoping constructor)”的出现。
  • 当你希望使用代码创建不同形式的产品(例如石头或木头房屋)时,可使用生成器模式。
  • 使用生成器构造组合树或其他复杂对象。

参考代码

使用建造普通房子以及别墅来模拟
iBuilder.go: 生成器接口

package main

type IBuilder interface {
	setWindowType()
	setDoorType()
	setNumFloor()
	getHouse() House
}

func getBuilder(builderType string) IBuilder {
	if builderType == "normal" {
		return newNormalBuilder()
	}

	if builderType == "villa" {
		return newVillaBuilder()
	}
	return nil
}

normalBuilder.go: 普通房子生成器

package main

type NormalBuilder struct {
    windowType string
    doorType   string
    floor      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,
    }
}

villaBuilder.go: 别墅生成器

package main

type VillaBuilder struct {
	windowType string
	doorType   string
	floor      int
}

func newVillaBuilder() *VillaBuilder {
	return &VillaBuilder{}
}

func (b *VillaBuilder) setWindowType() {
	b.windowType = "Snow Window"
}

func (b *VillaBuilder) setDoorType() {
	b.doorType = "Snow Door"
}

func (b *VillaBuilder) setNumFloor() {
	b.floor = 1
}

func (b *VillaBuilder) getHouse() House {
	return House{
		doorType:   b.doorType,
		windowType: b.windowType,
		floor:      b.floor,
	}
}

house.go: 房子产品

package main

type House struct {
	windowType string
	doorType   string
	floor      int
}

director.go: 主管类

package main

type 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 main

import "fmt"

func main() {
	normalBuilder := getBuilder("normal")
	villaBuilder := getBuilder("villa")

	director := newDirector(normalBuilder)
	normalHouse := director.buildHouse()

	fmt.Printf("Normal House Door Type: %s\n", normalHouse.doorType)
	fmt.Printf("Normal House Window Type: %s\n", normalHouse.windowType)
	fmt.Printf("Normal House Num Floor: %d\n", normalHouse.floor)

	director.setBuilder(villaBuilder)
	villa := director.buildHouse()

	fmt.Printf("\nIgloo House Door Type: %s\n", villa.doorType)
	fmt.Printf("Igloo House Window Type: %s\n", villa.windowType)
	fmt.Printf("Igloo House Num Floor: %d\n", villa.floor)

}

output:

Normal House Door Type: Wooden Door
Normal House Window Type: Wooden Window
Normal House Num Floor: 2

Igloo House Door Type: Snow Door
Igloo House Window Type: Snow Window
Igloo House Num Floor: 1

到此这篇关于go 生成器模式的具体使用的文章就介绍到这了,更多相关go 生成器模式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 一文带你了解Go语言标准库math和rand的常用函数

    一文带你了解Go语言标准库math和rand的常用函数

    这篇文章主要为大家详细介绍了Go语言标准库math和rand中的常用函数,文中的示例代码讲解详细, 对我们学习Go语言有一定的帮助,感兴趣的小伙伴可以了解一下
    2022-12-12
  • Go方法简单性和高效性的充分体现详解

    Go方法简单性和高效性的充分体现详解

    本文深入探讨了Go语言中方法的各个方面,包括基础概念、定义与声明、特性、实战应用以及性能考量,文章充满技术深度,通过实例和代码演示,力图帮助读者全面理解Go方法的设计哲学和最佳实践
    2023-10-10
  • Go检查结构体中是否存在某个字段及创建结构体切片或映射

    Go检查结构体中是否存在某个字段及创建结构体切片或映射

    这篇文章主要为大家介绍了Go检查结构体中是否存在某个字段及创建结构体切片或映射实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • go语言编程学习实现图的广度与深度优先搜索

    go语言编程学习实现图的广度与深度优先搜索

    这篇文章主要为大家介绍了go语言编程学习实现图的广度与深度优先搜索示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Go语言基础变量的声明及初始化示例详解

    Go语言基础变量的声明及初始化示例详解

    这篇文章主要为大家介绍了Go语言基础变量的声明及初始化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步,早日升职加薪
    2021-11-11
  • Golang Goroutine的使用

    Golang Goroutine的使用

    这篇文章主要介绍了Golang Goroutine的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Skywalking-go自动监控增强使用探究

    Skywalking-go自动监控增强使用探究

    这篇文章主要介绍了Skywalking-go自动监控增强使用深入探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 如何使用Golang打包jar应用

    如何使用Golang打包jar应用

    go:embed 是 Go 1.16 引入的一个强大功能,它允许在编译时将外部文件或目录嵌入到 Go 程序中,下面介绍如何使用 go:embed 来嵌入JAR 文件,感兴趣的朋友一起看看吧
    2025-04-04
  • 详解Go语言中获取文件路径的不同方法与应用场景

    详解Go语言中获取文件路径的不同方法与应用场景

    在使用 Go 开发项目时,估计有不少人遇到过无法正确处理文件路径的问题,本文将尝试从简单到复杂,详细介绍 Go 中获取路径的不同方法及应用场景,希望对大家有所帮助
    2024-02-02
  • golang 使用 viper 读取自定义配置文件

    golang 使用 viper 读取自定义配置文件

    这篇文章主要介绍了golang 使用 viper 读取自定义配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01

最新评论