golang设计模式之建造者模式

栏目: Go · 发布时间: 5年前

内容简介:最近一直在写框架,这个系列也好久没更新了,抽时间更新一篇~wiki:直白一点的说,就是将我们在开发过程中遇到的大型对象,拆分成多个小对象,然后将多个小对象组装成大对象,并且对外部隐藏建造过程.

最近一直在写框架,这个系列也好久没更新了,抽时间更新一篇~

概述

wiki: 建造者模式(Builder Pattern) :将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

直白一点的说,就是将我们在开发过程中遇到的大型对象,拆分成多个小对象,然后将多个小对象组装成大对象,并且对外部隐藏建造过程.

结构

建造者模式由一下4个部分组成

  • Builder : 抽象建造者

  • ConcreteBuilder : 具体建造者

  • Director : 指挥者

  • Production : 产品(大型产品以及拆分成的小型产品)

类图 && 时序图

golang设计模式之建造者模式
golang设计模式之建造者模式

( 图源网络 )

从上面两张图可以看出建造者模式的使用流程:

  1. 创建大型产品建造者
  2. 创建指挥者
  3. 将建造者传入指挥者对象中
  4. 由指挥者指挥建造者创建对象,并返回

举个栗子

说一个网上说烂了的组装汽车的栗子吧,

比如说我是个老司机,但是除了开车还想造车,但是车的构造实在是太复杂了,那么我们就可以将车拆分...

4个轮子、1个底盘、1个驾驶位...

好了,为了简便,就造这三个吧,先造个爬犁出来...

所以我需要一个大型项目构造者 CarBuilder :

type CarBuilder struct {
	Car *Car
}

func (cb *CarBuilder) GetResult() interface{} {
	return cb.Car
}

func (cb *CarBuilder) NewProduct() {
	cb.Car = new(Car)
}

func (cb *CarBuilder) BuildWheels() {
	cb.Car.Wheels = "build wheels"
}

func (cb *CarBuilder) BuildChassis() {
	cb.Car.Chassis = "build chassis"
}

func (cb *CarBuilder) BuildSeat() {
	cb.Car.Seat = "build seat"
}
复制代码

这个建造者实现了 Builder 接口:

type Builder interface {
  	  NewProduct()       // 创建一个空产品
	  BuildWheels()      // 建造轮子
	  BuildChassis()     // 建造底盘
	  BuildSeat()        // 建造驾驶位
	  GetResult() interface{}  // 获取建造好的产品
  }
复制代码

下面要把具体建造者传入指挥者:

type Director struct {
	builder Builder
}

func (d *Director) SetBuilder(builder Builder) {
	d.builder = builder
}
复制代码

现在指挥者和建造者都已经准备好了,可以进行建造了,调用指挥者的 Generate() 方法:

func (d *Director) Generate() *Car {
	d.builder.NewProduct()
	d.builder.BuildChassis()
	d.builder.BuildSeat()
	d.builder.BuildWheels()
	return d.builder.GetResult().(*Car)
}
复制代码

这样,就得到了我们需要的 Car 对象:

func main() {
   	// 创建一个指挥者
   	director := new(Director)
   	// 创建建造者
   	builder := new(CarBuilder)
       director.SetBuilder(builder)
   	car := director.Generate()
   	car.Show()
   }
复制代码

总结

上面的代码,是将一个本来就不是很复杂的对象,强行拆分,只是将其中的字段设为最简单的 string 类型,实际上,这些字段应该是更小的对象结构体,然后还可以继续把这些小结构体继续拆分,拆分为最小单元,这样才是结构最清晰的思路.

本来想举一个应用在实际项目中的栗子的,但是框架还没有写完,这样,先占个坑,等 bingo 框架完成后我会再来补充这一部分.

上述代码均放在 golang-design-patterns 这个仓库中

打个广告,推荐一下自己写的 go web框架 bingo ,求star,求PR ~


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Development Recipes

Web Development Recipes

Brian P. Hogan、Chris Warren、Mike Weber、Chris Johnson、Aaron Godin / Pragmatic Bookshelf / 2012-1-22 / USD 35.00

You'll see a full spectrum of cutting-edge web development techniques, from UI and eye candy recipes to solutions for data analysis, testing, and web hosting. Make buttons and content stand out with s......一起来看看 《Web Development Recipes》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具