什么是生成器设计模式
- 众所周知我们设计代码的时候要将代码设计出模块化的,一个功能是一个模块,那么生成器设计模式,是将一个类再度进行了一个拆分,让一个类的内部进行了单一职责化,其实我们在平时开发的时候就会不经意的使用到该设计模式。
- 相当于在N个相似的生产线上我们通过定义了一个共有的interface,这N个生成线都是以相似的步骤来生成东西。
- 该模式有点类似与工厂设计模式,工厂设计模式是用来生成一系列相关的对象,生成器设计模式可以将一个复杂的对象拆分成很多步骤来完成。
使用场景
-
复杂对象的创建:当对象的创建过程涉及到多个步骤,并且这些步骤的顺序可能会变化时,生成器模式可以提供一种灵活的方式来创建对象。
-
不同的表示:当一个对象可以有多种不同的表示,而且你希望在运行时动态地选择表示时,生成器模式可以提供一种解决方案。
-
封装创建过程:当你希望封装对象的创建过程,以便在不暴露对象的内部表示的情况下创建对象时,生成器模式可以提供帮助。
UML图
代码
package generatortype Generator interface {setWindow()setDoor()setWall()setRoof()
}type GeneratorHouse struct {
}func NewGeneratorHouse() *GeneratorHouse {return &GeneratorHouse{}
}func (g *GeneratorHouse) setWindow() {println("set window for house")
}func (g *GeneratorHouse) setDoor() {println("set door for house")
}func (g *GeneratorHouse) setWall() {println("set wall for house")
}func (g *GeneratorHouse) setRoof() {println("set roof for house")
}
func (g *GeneratorHouse) GetResult() {println("set window for highrises")
}type GeneratorHighRises struct {
}func (g *GeneratorHighRises) setWindow() {println("set window for highrises")
}func (g *GeneratorHighRises) setDoor() {println("set door for highrises")
}func (g *GeneratorHighRises) setWall() {println("set wall for highrises")
}func (g *GeneratorHighRises) setRoof() {println("set roof for highrises")
}func (g *GeneratorHighRises) GetResult() {println("set window for highrises")
}type Director struct {
}func (d *Director) Excuter(task string) {if task == "house" {house := NewGeneratorHouse()house.setDoor()house.setRoof()house.setWall()house.setWindow()house.GetResult()}if task == "highrises" {highrises := &GeneratorHighRises{}highrises.setDoor()highrises.setRoof()highrises.setWall()highrises.setWindow()highrises.GetResult()}
}