[go] 生成器模式

这篇具有很好参考价值的文章主要介绍了[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:文章来源地址https://www.toymoban.com/news/detail-821035.html

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] 生成器模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 建造者模式(生成器模式)

    依赖倒转原则 = 抽象不应该依赖细节,细节应该依赖于抽象 对流程进行抽象,流程中具体细节依赖于这个抽象 过程是稳定的,细节是不同的 建造者模式(Builder),将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示 建造者模式解析 Director:指挥者,是

    2024年04月15日
    浏览(28)
  • Java设计模式-生成器模式

    前言 今天接到一个需求,是对 订单做一些监控。比如有提货监控、送货监控、出库监控。每一种类型的监控,都有很多相应的 字段需要去填充 相应的值 Java设计模式:将一个复杂对象的构建与它的 表示分离,使用同样的构建可以创建不同的表示。 适合该模式的情景:对象

    2024年02月10日
    浏览(36)
  • Golang 通用代码生成器仙童正在研发 2.4.0 电音仙女版本,发布研发探秘视频

    Golang 通用代码生成器仙童正在研发 2.4.0 电音仙女版本,发布研发探秘视频 Golang 通用代码生成器仙童正在研发 2.4.0 电音仙女版本,已发布研发探秘视频,数周内可以发布新版本。视频请见:https://www.bilibili.com/video/BV1WQ4y1g78E/ 电音仙女版本支持枚举和哑数据模式。支持三大部

    2024年02月03日
    浏览(28)
  • Golang 通用代码生成器仙童发布 2.4.0 电音仙女尝鲜版一及其介绍视频

    Golang 通用代码生成器仙童发布 2.4.0 电音仙女尝鲜版一及其介绍视频 Golang 通用代码生成器仙童已发布 2.4.0 电音仙女尝鲜版一及其介绍视频。视频请见:https://www.bilibili.com/video/BV1nu4y1K7sz/ 电音仙女版本支持日期和日期时间。支持三大部分生成功能群。支持枚举。支持哑数据模

    2024年02月03日
    浏览(32)
  • 【16】c++设计模式——>建造者(生成器)模式

    建造者模式(Builder Pattern)是一种 创建型设计模式 ,它允许你构造复杂对象步骤分解。你可以不同的步骤中使用不同的方式创建对象,且对象的创建与表示是分离的。这样,同样的构建过程可以创建不同的表示。 在 C++ 中,建造者模式通常涉及到以下几个关键部分: 1. 产品

    2024年02月07日
    浏览(32)
  • Golang 通用代码生成器仙童已发布 2.4.0 电音仙女尝鲜版二及其介绍视频,详细介绍了三大部分生成功能群

    Golang 通用代码生成器仙童已发布 2.4.0 电音仙女尝鲜版二及其介绍视频,详细介绍了三大部分生成功能群 Golang 通用代码生成器仙童已发布 2.4.0 电音仙女尝鲜版二及其介绍视频。详细介绍了三大部分生成功能群。 三大部分生成功能群即高级定制功能群,部分生成功能群和自动

    2024年01月24日
    浏览(26)
  • C++设计模式-生成器(Builder)

    目录 C++设计模式-生成器(Builder) 一、意图 二、适用性 三、结构 四、参与者 五、代码 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。 当构造过程必须允许被

    2024年02月07日
    浏览(38)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(68)
  • 【信号生成器】从 Excel 数据文件创建 Simulink 信号生成器块研究(Simulink)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 要从

    2024年02月13日
    浏览(39)
  • 生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

            生成器设计模式(Builder Design Pattern)是一种创建型设计模式,用于处理具有多个属性和复杂构造过程的对象。生成器模式通过将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。这有助于减少构造函数的参数个数,提高代码的可读性和可维

    2023年04月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包