本网站的中文版本尚处早期开发阶段。如果您发现其中存在错字、纰漏或其他任何问题,请随时联系向我反馈。
生成器

Go 生成器模式讲解和代码示例

生成器是一种创建型设计模式 使你能够分步骤创建复杂对象

与其他创建型模式不同 生成器不要求产品拥有通用接口 这使得用相同的创建过程生成不同的产品成为可能

概念示例

当所需产品较为复杂且需要多个步骤才能完成时 也可以使用生成器模式 在这种情况下 使用多个构造方法比仅仅使用一个复杂可怕的构造函数更简单 分为多个步骤进行构建的潜在问题是 构建不完整的和不稳定的产品可能会被暴露给客户端 生成器模式能够在产品完成构建之前使其处于私密状态

在下方的代码中 我们可以看到 igloo­Builder冰屋生成器 normal­Builder普通房屋生成器可建造不同类型房屋 igloo冰屋 normal­House普通房屋  每种房屋类型的建造步骤都是相同的 主管 可选 结构体可对建造过程进行组织

iBuilder.go: 生成器接口

package main

type iBuilder interface {
	setWindowType()
	setDoorType()
	setNumFloor()
	getHouse() house
}

func getBuilder(builderType string) iBuilder {
	if builderType == "normal" {
		return &normalBuilder{}
	}

	if builderType == "igloo" {
		return &iglooBuilder{}
	}
	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,
	}
}

iglooBuilder.go: 具体生成器

package main

type iglooBuilder struct {
	windowType string
	doorType   string
	floor      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 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")
	iglooBuilder := getBuilder("igloo")

	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(iglooBuilder)
	iglooHouse := director.buildHouse()

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

}

output.txt: 执行结果

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

生成器在其他编程语言中的实现

Java 生成器模式讲解和代码示例 C# 生成器模式讲解和代码示例 C++ 生成器模式讲解和代码示例 PHP 生成器模式讲解和代码示例 Python 生成器模式讲解和代码示例 Ruby 生成器模式讲解和代码示例 Swift 生成器模式讲解和代码示例 TypeScript 生成器模式讲解和代码示例