创建型:二. 生成器模式
生成器模式是什么
生成器模式也叫做建造者模式,是一种创建型的设计模式, 使你能够分步骤创建复杂对象。
为什么要用生成器模式
假设有这样一个复杂对象, 在对其进行构造时需要对诸多成员变量和嵌套对象进行复杂的初始化工作。这些初始化代码通常深藏于一个包含众多参数且让人基本看不懂的构造函数中。而且在很多时候的程序调用中只需要少部分的成员参数。这个时候如果我们写一个复杂的构造函数不仅不利于维护,而且很多成员参数用不到是一种浪费。
生成器模式怎么实现
首先是我们的目标即:创建的具体的产品,然后我们写两个具体的生成器来实现这个产品,最后是生成器接口来抽象实现的方法。
house.go: 产品
type house struct {
windowType string
doorType string
floor int
}
ormalBuilder.go: 具体生成器
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: 具体生成器
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,
}
}
iBuilder.go: 生成器接口
type iBuilder interface {
setWindowType()
setDoorType()
setNumFloor()
getHouse() house
}
优点
- 你可以分步创建对象, 或暂缓创建步骤。
- 可以更加精细地控制产品的创建过程。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
- 具体的建造者相互独立,因此可以对建造的过程逐步细化,而不会对其他模块产生任何影响。
缺点
- 建造者模式所创建的产品一般具有较多的共同点,其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。
- 如果产品内部发生变化 , 建造者也要相应修改。