GoLang设计模式01 - 建造者模式
时间:2021-09-05
本文章向大家介绍GoLang设计模式01 - 建造者模式,主要包括GoLang设计模式01 - 建造者模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
建造者模式是一种创建型模式,主要用来创建比较复杂的对象。
建造者模式的使用场景:
- 建造者模式通常适用于有多个构造器参数或者需要较多构建步骤的场景。使用建造者模式可以精简构造器参数的数量,让构建过程更有条理。
- 可以为同一个产品提供两个不同的实现。比如,在下面的代码中,为
house
类型创建了两个不同的实现:通过iglooBuilder构建的igloo(冰屋),以及通过cabinBuilder构建的cabin(木屋) - 可以应用于构建过程不允许被中断的场景。仍然参考刚才的代码,
house
类型的对象要么彻底完成,要么压根没有创建,不会存在中间状态,这是因为structdirector
封装了相应的过程,中间状态仅存在于ConcreteBuilder中。
下面是UML类图:
代码大致如下。
house.go:
package main type house struct { windowType string doorType string floor int }
iBuilder.go:
package main type iBuilder interface { setWindowType() setDoorType() setNumFloor() getHouse() house } func getBuilder(builderType string) iBuilder { if builderType == "cabin" { return &cabinBuilder{} } if builderType == "igloo" { return &iglooBuilder{} } return nil }
iglooBuilder.go
package main type iglooBuilder struct { house } func newIglooBuilder() *iglooBuilder { return &iglooBuilder{} } func (b *iglooBuilder) setWindowType() { b.windowType = "Ice Window" } func (b *iglooBuilder) setDoorType() { b.doorType = "Ice Door" } func (b *iglooBuilder) setNumFloor() { b.floor = 1 } func (b *iglooBuilder) getHouse() house { return b.house }
cabinBuilder.go
package main type cabinBuilder struct { house } func newCabinBuilder() *cabinBuilder { return &cabinBuilder{} } func (b *cabinBuilder) setWindowType() { b.windowType = "Wooden Window" } func (b *cabinBuilder) setDoorType() { b.doorType = "Wooden Door" } func (b *cabinBuilder) setNumFloor() { b.floor = 2 } func (b *cabinBuilder) getHouse() house { return b.house }
director.go
package main type director struct { builder iBuilder } func newDirector(b iBuilder) *director { return &director{ builder: b, } } func (d *director) setBuilder(b iBuilder) { d.builder = b } func (d *director) buildHouse() house { d.builder.setDoorType() d.builder.setWindowType() d.builder.setNumFloor() return d.builder.getHouse() }
最后是main方法:
package main import ( "fmt" ) func main() { cabinBuilder := getBuilder("cabin") iglooBuilder := getBuilder("igloo") director := newDirector(cabinBuilder) cabinHouse := director.buildHouse() fmt.Printf("Cabin House Door Type: %s\n", cabinHouse.doorType) fmt.Printf("Cabin House Window Type: %s\n", cabinHouse.windowType) fmt.Printf("Cabin House Num Floor: %d\n", cabinHouse.floor) director.setBuilder(iglooBuilder) iglooHouse := director.buildHouse() fmt.Printf("\nIgloo House Door Type: %s\n", iglooHouse.doorType) fmt.Printf("Igloo House Window Type: %s\n", iglooHouse.windowType) fmt.Printf("Igloo House Num Floor: %d\n", iglooHouse.floor) }
代码已上传到GitHub:zhyea / go-patterns / builder-pattern
End!
仅是学习笔记,难免出错,望不吝指点
原文地址:https://www.cnblogs.com/amunote/p/15228829.html
- html5语义化标签——回顾
- flex布局——回顾
- WordPress 网站开发“微信小程序”实战(五)
- Windows Runtime(WinRT) 揭秘
- WeApp-Workflow: 基于Gulp 的微信小程序前端开发工作流
- 如何安装Windows Phone SDK 7.1 Release Candidate (RC)
- 微信与支付宝回应央行新规:认同央行规范!
- Gulp 工作流中Sass 增量编译功能的探索
- Sass与Compass——回顾
- 苹果就“降速门”致歉;央行批扫码支付不正当竞争;王健林旗下公司遭集体裁员
- 姚期智教授:量子计算是千亿万亿级别的产业,或成为科技创新的引擎
- Powershell中禁止执行脚本解决办法
- 使用AsyncTask异步更新UI界面及原理分析
- 商家为何要做小程序?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- OpenCV与图像处理(八)
- 类模块
- Netty入门篇
- 面试官:谈谈类加载器吧,你有没有看过类加载器的源码?
- 数据维度爆炸怎么办?详解5大常用的特征选择方法
- 给卷积神经网络动动刀:加法网络探究
- 用Python网络爬虫来看看最近电影院都有哪些上映的电影
- 使用 Azure Blob Stoage 实现一个静态文件服务器
- java学习--反射详解
- Redis中的管道Pipeline操作
- 查看YARN任务日志的几种方式
- 简易数字频率计(verilog HDL设计)(2020维护版本)
- C++核心准则CP.111:如果真的需要好双重检查锁,使用惯用模式
- C++核心准则CP.200:使用volatile只能表明该变量是非C++内存
- C++核心准则E.2:通过抛出异常来表明函数无法执行指定的任务