builder.go

package builder

type BuildProcess interface {
	SetWheels() BuildProcess
	SetSeats() BuildProcess
	SetStructure() BuildProcess
	GetVehicle() VehicleProduct
}

type ManufacturingDirector struct {
	builder BuildProcess
}

func (f *ManufacturingDirector) Construct() {
	//Implementation goes here
	f.builder.SetSeats().SetStructure().SetWheels()
}

func (f *ManufacturingDirector) SetBuilder(b BuildProcess) {
	//Implementation goes here
	f.builder = b
}

type VehicleProduct struct {
	Wheels    int
	Seats     int
	Structure string
}

type CarBuilder struct {
	v VehicleProduct
}

func (c *CarBuilder) SetWheels() BuildProcess {
	c.v.Wheels = 4
	return c
}

func (c *CarBuilder) SetSeats() BuildProcess {
	c.v.Seats = 5
	return c
}

func (c *CarBuilder) SetStructure() BuildProcess {
	c.v.Structure = "Car"
	return c
}

func (c *CarBuilder) GetVehicle() VehicleProduct {
	return c.v
}

type BikeBuilder struct {
	v VehicleProduct
}

func (b *BikeBuilder) SetWheels() BuildProcess {
	b.v.Wheels = 2
	return b
}

func (b *BikeBuilder) SetSeats() BuildProcess {
	b.v.Seats = 2
	return b
}

func (b *BikeBuilder) SetStructure() BuildProcess {
	b.v.Structure = "Motorbike"
	return b
}

func (b *BikeBuilder) GetVehicle() VehicleProduct {
	return b.v
}

  

builder_test.go

package builder

import "testing"

func TestBuilderPattern(t *testing.T) {
	manufacturingComplex := ManufacturingDirector{}

	carBuilder := &CarBuilder{}
	manufacturingComplex.SetBuilder(carBuilder)
	manufacturingComplex.Construct()

	car := carBuilder.GetVehicle()

	if car.Wheels != 4 {
		t.Errorf("Wheels on a car must be 4 and they were %d\n", car.Wheels)
	}

	if car.Structure != "Car" {
		t.Errorf("Structure on a car must be 'Car' and was %s\n", car.Structure)
	}

	if car.Seats != 5 {
		t.Errorf("Seats on a car must be 4 and they were %d\n", car.Seats)
	}

	bikeBuiler := &BikeBuilder{}
	manufacturingComplex.SetBuilder(bikeBuiler)
	manufacturingComplex.Construct()

	motorbike := bikeBuiler.GetVehicle()
	motorbike.Seats = 1

	if motorbike.Wheels != 2 {
		t.Errorf("Wheels on a motobike must be 2 and they were %d\n", motorbike.Wheels)
	}

	if motorbike.Structure != "Motorbike" {
		t.Errorf("Structure on a motobike must be 'Motorbike' and was %s\n", motorbike.Structure)
	}

}

  

最新文章

  1. HDU 2087 字符串
  2. Scala包
  3. 作业2源程序版本管理软件优缺点,及Github注册
  4. 夺命雷公狗ThinkPHP项目之----企业网站24之网站前台获取当前栏目和顶级栏目
  5. 将n行3列的数据dataTable装换成m行7列的dataTable
  6. 实现从sql server存取二进制图片
  7. css 等高补偿法
  8. 简要介绍EF(实体框架)
  9. [LeetCode141]Linked List Cycle
  10. 在实现从excel中读取数据作为接口参数遇到的问题
  11. 使用Python Shapefile Library创建和编辑Shapefile文件
  12. 每日冲刺报告--Day2
  13. vue---slot,slot-scoped,以及2.6版本之后插槽的用法
  14. hashlib模块(加密模块)
  15. java垃圾回收机制GC
  16. 在vue中使用highcharts的仪表图等扩展
  17. react better-scroll 编写类似手机chrome的header显示隐藏效果
  18. python 全栈开发,Day44(IO模型介绍,阻塞IO,非阻塞IO,多路复用IO,异步IO,IO模型比较分析,selectors模块,垃圾回收机制)
  19. Spring P命名空间 02
  20. POJ 1904 King's Quest(强连通图)题解

热门文章

  1. springboot~maven集成开发里的docker构建
  2. C#调试程序——断点+几种观察数据的方法
  3. Spring基础——AOP通知
  4. English:Day-to-day 1104
  5. 分析Android APK-反编译修改打包
  6. 使用 Anydesk 5.1 TCP 通道(端口映射)功能从外网方便访问内网的 web/数据库等资源
  7. 023.[转] 尚硅谷_Maven笔记
  8. VMware安装Linux提示此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态
  9. Eclipse中如何添加相对路径的外部jar包
  10. docx和doc的区别