- 概念:使用多个复杂的对象构造成一个复杂的对象。
- 目的:将复杂的构建与表现相分离,使同样的构建可以构建不同的表示。
-顺便整理了点小demo:
package pattern
import (
"fmt"
"testing"
)
func TestBuilder(t *testing.T) {
// shenzhen glasses
director := Director{OriginPrice: 1.1}
var builder Builder = &ShenzhenGlasses{}
shenzhenGlasses := director.Creator(builder)
fmt.Printf("glasses comes from %s, price is %G \n", shenzhenGlasses.From, shenzhenGlasses.Price)
// guangzhou glasses
builder = &GuangzhouGlasses{}
guangzhouGlasses := director.Creator(builder)
fmt.Printf("glasses comes from %s, price is %G", guangzhouGlasses.From, guangzhouGlasses.Price)
}
type Glasses struct {
Price float64
From string
}
type Builder interface {
SetPrice(price float64) Builder
SetFrom() Builder
GetGlasses() *Glasses
}
type ShenzhenGlasses struct {
glasses *Glasses
}
type GuangzhouGlasses struct {
glasses *Glasses
}
func (g *ShenzhenGlasses) SetPrice(price float64) Builder {
if g.glasses == nil {
g.glasses = &Glasses{}
}
g.glasses.Price = price * 2.1
return g
}
func (g *ShenzhenGlasses) SetFrom() Builder {
if g.glasses == nil {
g.glasses = &Glasses{}
}
g.glasses.From = "shenzhen"
return g
}
func (g *ShenzhenGlasses) GetGlasses() *Glasses {
return g.glasses
}
func (g *GuangzhouGlasses) SetPrice(price float64) Builder {
if g.glasses == nil {
g.glasses = &Glasses{}
}
g.glasses.Price = price * 1.2
return g
}
func (g *GuangzhouGlasses) SetFrom() Builder {
if g.glasses == nil {
g.glasses = &Glasses{}
}
g.glasses.From = "guangzhou"
return g
}
func (g *GuangzhouGlasses) GetGlasses() *Glasses {
return g.glasses
}
type Director struct {
OriginPrice float64
}
func (d *Director) Creator(b Builder) *Glasses {
return b.SetPrice(d.OriginPrice).SetFrom().GetGlasses()
}
网友评论