這是要寫的創建類模式最後一篇,先看下,建造者模式的定義吧。
將一個複雜對象的構造與它的表示分離,使同樣的構建過程可以創建不同的表示。
看到這個定義有點難懂,建造者有以下幾個角色。
- Product 這是我們要創建的複雜對象(一般都是很複雜的對象才需要使用建造者模式)。
- Builder 抽象的一個東西, 主要是用來規範我們的建造者的。
- ConcreteBuilder 具體的Builder實現, 這是今天的重點,主要用來根據不用的業務來完成要創建對象的組建的創建。
- Director 這個的作用是規範複雜對象的創建流程。
基於以上的理論,我們還是通過代碼來實現
定義接口Builder
type Builder struct {
Part1()
Part2()
Part3()
}
定義Director
type Director struct {
Build Builder
}
func NewBuilder(build Builder) *Director {
return &Director{
Build: build,
}
}
定義Director的ConcreteBuilder
//Construct Product
func (d *Director) Construct() {
d.builder.Part1()
d.builder.Part2()
d.builder.Part3()
}
接下來實現product這個產品
type Builder1 struct {
result string
}
func (b *Builder1) Part1() {
b.result += "1"
}
func (b *Builder1) Part2() {
b.result += "2"
}
func (b *Builder1) Part3() {
b.result += "3"
}
func (b *Builder1) GetResult() string {
return b.result
}
type Builder2 struct {
result int
}
func (b *Builder2) Part1() {
b.result += 1
}
func (b *Builder2) Part2() {
b.result += 2
}
func (b *Builder2) Part3() {
b.result += 3
}
func (b *Builder2) GetResult() int {
return b.result
}
以下實現的完整代碼
package main
import "fmt"
type Builder interface {
Part1()
Part2()
Part3()
}
type Director struct {
Builder Builder
}
func NewDirector(builder Builder) *Director {
return &Director{
Builder:builder,
}
}
func (d *Director) Construct() {
d.Builder.Part1()
d.Builder.Part2()
d.Builder.Part3()
}
type Builder1 struct {
result string
}
func (b *Builder1) Part1() {
b.result += "1"
}
func (b *Builder1) Part2() {
b.result += "2"
}
func (b *Builder1) Part3() {
b.result += "3"
}
func (b *Builder1) GetResult() string {
return b.result
}
type Builder2 struct {
result int
}
func (b *Builder2) Part1() {
b.result += 1
}
func (b *Builder2) Part2() {
b.result += 2
}
func (b *Builder2) Part3() {
b.result += 3
}
func (b *Builder2) GetResult() int {
return b.result
}
func main() {
builder1 := &Builder1{}
director1 := NewDirector(builder1)
director1.Construct()
res1 := builder1.GetResult()
fmt.Println("構造1", res1)
builder2 := &Builder2{}
director2 := NewDirector(builder2)
director2.Construct()
res2 := builder2.GetResult()
fmt.Println("構造2", res2)
}