建造者模式

建造者接口

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
	*/
}
posted @ 2022-09-06 15:15  理科土拨鼠  阅读(35)  评论(0)    收藏  举报