Hi all, 在上一篇我們寫了Builder Pattern的雛形,在這一篇我會接續這個模型來套在我們日常開發的案例中。
這次案例中,將會以筆電生產來做例子🌰。
案例背景:目前有間筆電代工廠,然後他主要生產 Asus筆電及RoG系列筆電。
package Products
type Labtop struct {
LabtopType string
}
package Builders
import "builder/Products"
type Builder interface {
SetLabtopType()
GetLabtop() *Products.Labtop
}
package Builders
import "builder/Products"
type RogBuilder struct {
LabtopType string
}
func (rog *RogBuilder) SetLabtopType() {
rog.LabtopType = "ROG"
}
func (rog *RogBuilder) GetLabtop() *Products.Labtop {
rog.SetLabtopType()
return &Products.Labtop{LabtopType: rog.LabtopType}
}
func NewRogBuilder() *RogBuilder {
return &RogBuilder{}
}
package Builders
import "builder/Products"
type AsusBuilder struct {
LabtopType string
}
func (a *AsusBuilder) SetLabtopType() {
a.LabtopType = "ASUS"
}
func (a *AsusBuilder) GetLabtop() *Products.Labtop {
a.SetLabtopType()
return &Products.Labtop{LabtopType: a.LabtopType}
}
func NewAsusBuilder() *AsusBuilder {
return &AsusBuilder{}
}
package Directors
import (
"builder/Builders"
"builder/Products"
)
type Director struct {
buider Builders.Builder
}
func (d *Director) SetBuilder(buider Builders.Builder) {
d.buider = buider
}
func NewDirector() *Director {
return &Director{}
}
func (d *Director) BuilderLabtop() *Products.Labtop {
return d.buider.GetLabtop()
}
package main
import (
"builder/Builders"
"builder/Directors"
"fmt"
)
func main() {
asusBuilder := Builders.NewAsusBuilder()
rogBuilder := Builders.NewRogBuilder()
director := Directors.NewDirector()
director.SetBuilder(asusBuilder)
asus := director.BuilderLabtop()
fmt.Println("AsusBuilder: " + asus.LabtopType)
director.SetBuilder(rogBuilder)
rog := director.BuilderLabtop()
fmt.Println("RogBuilder: " + rog.LabtopType)
}
在這篇文章中,我們演示了如何將生產筆電的過程分解成更小,更可管理的部分,同時我們也保有了下列的特點:
我們通過將筆電類型設定的細節藏在各自的Builder(RogBuilder和AsusBuilder)之後,讓Director只需通過一個簡單的介面來創建筆電。
由於Builder是一個接口,往後可以輕鬆地添加更多類型的筆電,例如Dell或HP,而不需要更改Director。
每個類別(Product, Builder, AsusBuilder, RogBuilder, Director)都只做一件事,符合單一責任原則。
這種架構也有助於獨立測試各個組件,因為你可以簡單地替換或模擬Builder來測試Director的行為。
Director與筆電建造過程解耦,只需知道Builder介面即可。這意味著在未來需要變更或擴展時,你只需修改或添加新的Builder。