建造者模式
建造者接口
package Builder
// Builder 建造者接口规范
type Builder interface {
setName(string)
setAge(uint8)
getResult() string
}
建造的对象
package Builder
type Person struct {
name string
age uint8
}
func (p *Person) setName(name string) {
p.name = name
}
func (p *Person) setAge(age uint8) {
p.age = age
}
建造者1(幼儿园老师)
package Builder
import "fmt"
// 建造者1
type babyBuilder struct {
person Person //被建造的对象
}
// 构造函数
func NewBabyBuilder() *babyBuilder {
baby := new(babyBuilder)
baby.person = Person{}
return baby
}
// 设置姓名
func (b *babyBuilder) setName(name string) {
b.person.setName(name)
}
// 设置年龄
func (b *babyBuilder) setAge(age uint8) {
if age >= 7 || age < 3 {
fmt.Println("请检查信息是否输入正确")
return
}
b.person.setAge(age)
}
func (b *babyBuilder) getResult() string {
return fmt.Sprintf("学生姓名:%s---年龄:%d", b.person.name, b.person.age)
}
建造者2(小学老师)
package Builder
import "fmt"
// 建造者2
type stuBuilder struct {
person Person //被建造的对象
}
// 构造函数
func NewstuBuilder() *stuBuilder {
stu := new(stuBuilder)
stu.person = Person{}
return stu
}
// 设置姓名
func (b *stuBuilder) setName(name string) {
b.person.name = name
}
// 设置年龄
func (b *stuBuilder) setAge(age uint8) {
if age < 7 {
fmt.Println("请检查信息是否输入正确")
return
}
b.person.age = age
}
func (b *stuBuilder) getResult() string {
return fmt.Sprintf("学生姓名:%s---年龄:%d", b.person.name, b.person.age)
}
指挥者
package Builder
import "fmt"
type Director struct {
builder Builder
}
func NewDirector(builder Builder) *Director {
director := new(Director)
director.builder = builder
return director
}
func (d *Director) Construct(name string, age uint8) {
d.builder.setName(name)
d.builder.setAge(age)
fmt.Println(d.builder.getResult())
}
测试文件
package Builder
import "testing"
func TestBuilder(t *testing.T) {
dir := NewDirector(NewBabyBuilder())
dir.Construct("tom", 6)
dr := NewDirector(NewstuBuilder())
dr.Construct("jack", 12)
/*
学生姓名:tom---年龄:6
学生姓名:jack---年龄:12
--- PASS: TestDirector_Construct (0.00s)
PASS
*/
}

浙公网安备 33010602011771号