1. 概念
1.1 角色
- Builder(抽象建造者):給出一個抽象接口,以規(guī)范產(chǎn)品對象的各個組成成分的建造落午。
- ConcreteBuilder(具體建造者):它們在應用程序調(diào)用下創(chuàng)建產(chǎn)品的實例
- Director(導演者):調(diào)用具體建造者角色以創(chuàng)建產(chǎn)品對象。
它沒有產(chǎn)品類的具體知識建蹄,真正擁有產(chǎn)品類的具體知識的是具體建造者陋气。
- Product(產(chǎn)品):產(chǎn)品便是建造中的復雜對象溉跃。
1.2 類圖
image.png
classDiagram
Product <.. ConcreteBuilder
Builder <|.. ConcreteBuilder
Director o--> Builder
class Product{
}
class Builder{
<<interface>>
+BuildPartA(param:Parameter)
+BuildPartB(param:Parameter)
}
class ConcreteBuilder{
+product:*Product
+BuildPartA(param:Parameter)
+BuildPartB(param:Parameter)
+GetProduct():Product
}
class Director{
+builder:Builder
+Construct(param:Parameter)
}
2. 代碼示例
2.1 設計
- 定義一個產(chǎn)品
Product
,它包含Name
十减、PartA
栈幸、PartB
三個成員 - 定義一個抽象建造者
Builder
- 它的
CreateProduct()
方法來實例化一個產(chǎn)品 - 它的
BuildPartA()
愤估、BuildPartB()
兩個方法來裝配產(chǎn)品
- 它的
- 定義具體建造者
ConcreteBuilder
- 它實現(xiàn)了抽象建造者的
CreateProduct()
、BuildPartA()
侦镇、BuildPartB()
三個方法 - 它有的
Get()
方法用來查詢產(chǎn)品(我們這里簡單寫成打印產(chǎn)品實例)
- 它實現(xiàn)了抽象建造者的
- 定義導演者
Director
- 它關聯(lián)了建造者
Builder
(我們簡單寫一個關聯(lián)灵疮,當然你也可以寫成聚合) - 它的
Construct()
方法調(diào)用建造者創(chuàng)建產(chǎn)品并裝配
- 它關聯(lián)了建造者
- 調(diào)用
- 實例化一個建造者
builder
, - 實例化一個導演者
director
壳繁,它關聯(lián)建造者builder
- 用導演者
director
的Construct()
方法創(chuàng)建產(chǎn)品 - 使用建造者的
GetProduct()
方法查詢產(chǎn)品
- 實例化一個建造者
2.2 代碼
package main
import "fmt"
type Product struct {
Name string
PartA string
PartB string
}
type Builder interface {
CreateProduct(name string) *Product
BuildPartA(partA string, p *Product)
BuildPartB(partB string, p *Product)
}
type ConcreteBuilder struct {
}
func (c *ConcreteBuilder) CreateProduct(name string) *Product {
p := new(Product)
p.Name = name
return p
}
func (c *ConcreteBuilder) BuildPartA(partA string, p *Product) {
p.PartA = partA
}
func (c *ConcreteBuilder) BuildPartB(partB string, p *Product) {
p.PartB = partB
}
func (c *ConcreteBuilder) GetProduct(product *Product) {
fmt.Printf("%+v", product)
}
type Director struct {
builder Builder
}
func (d *Director) Construct(name string, partAInfo string, partBInfo string) *Product {
p := d.builder.CreateProduct(name)
d.builder.BuildPartA(partAInfo, p)
d.builder.BuildPartB(partBInfo, p)
return p
}
func main() {
builder := &ConcreteBuilder{}
director := &Director{builder: builder}
product := director.Construct("青龍刀", "刀頭", "刀柄")
builder.GetProduct(product)
}
- 輸出
&{Name:青龍刀 PartA:刀頭 PartB:刀柄}
2.3 類圖
image.png
classDiagram
Product <.. ConcreteBuilder
Builder <|.. ConcreteBuilder
Director o--> Builder
class Product{
+Name:String
+PartA:String
+PartB:String
}
class Builder{
<<interface>>
+ CreateProduct():*Product
+BuildPartA(p:string)
+BuildPartB(p:string)
}
class ConcreteBuilder{
+ CreateProduct():*Product
+BuildPartA(p:string)
+BuildPartB(p:string)
+GetProduct()
}
class Director{
+Builder builder
+Construct()
}