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)
}
End!
GoLang设计模式01 - 建造者模式的更多相关文章
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- C#设计模式(5)——建造者模式(Builder Pattern)
一.引言 在软件系统中,有时需要创建一个复杂对象,并且这个复杂对象由其各部分子对象通过一定的步骤组合而成.例如一个采购系统中,如果需要采购员去采购一批电脑时,在这个实际需求中,电脑就是一个复杂的对象, ...
- 【GOF23设计模式】建造者模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]建造者模式详解类图关系 建造飞船 package com.test.Builder; public class AirShi ...
- C++设计模式之建造者模式(三)
4.引入钩子方法的建造者模式 建造者模式除了逐步构建一个复杂产品对象外.还能够通过Director类来更加精细地控制产品的创建过程.比如添加一类称之为钩子方法(HookMethod)的特殊方法来控制是 ...
- 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
原文:乐在其中设计模式(C#) - 建造者模式(Builder Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 建造者模式(Builder Pattern) 作者:webabc ...
- 折腾Java设计模式之建造者模式
博文原址:折腾Java设计模式之建造者模式 建造者模式 Separate the construction of a complex object from its representation, a ...
- C#设计模式之四建造者模式(Builder Pattern)【创建型】
一.引言 今天我们要讲讲Builder模式,也就是建造者模式,当然也有叫生成器模式的,英文名称是Builder Pattern.在现实生活中,我们经常会遇到一些构成比较复杂的物品,比如:电脑,它就是一 ...
- Golang设计模式—简单工厂模式(Simple Factory Pattern)
Golang设计模式--简单工厂模式 背景 假设我们在做一款小型翻译软件,软件可以将德语.英语.日语都翻译成目标中文,并显示在前端. 思路 我们会有三个具体的语言翻译结构体,或许以后还有更多,但现在分 ...
- Java 设计模式之建造者模式(四)
原文地址:Java 设计模式之建造者模式(四) 博客地址:http://www.extlight.com 一.前言 今天继续介绍 Java 设计模式中的创建型模式--建造者模式.上篇设计模式的主题为 ...
随机推荐
- python 处理protobuf 接口常见错误
python 处理protobuf 接口常见错误 1.问题 : Assignment not allowed to repeated field '> http://www.coin163.co ...
- 2021最新Java基础知总结,助力大厂offer
本文是我花了三周时间整理出来的,希望对Java初学者有帮助~ Java概述 Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程是一种软件开发思想. 面向过程就是分析出解决问题所需要的 ...
- SpringBoot自动装配-Condition
1. 简介 @Conditional注解在Spring4.0中引入,其主要作用就是判断条件是否满足,从而决定是否初始化并向容器注册Bean. 2. 定义 2.1 @Conditional @Condi ...
- time() 在thinkphp 3.2.3 模板格式化输出
{$ltime|date="Y-m-d",###}
- noip模拟测试22
考试总结:这次考试题,有好多部分分,导致了我在考试过程中一心想拿到这些部分分,对于正解没有留出时间进行思考,这是一个教训,在以后的考试中我一定要留出足够的思考时间,不要被部分分限制.还有,我的部分分也 ...
- web浏览器知识点
网页是怎么形成的 前端的代码(英文字母)---->浏览器渲染 ------- > 客户眼中的效果 浏览器(显示代码) 游览器是网页显示,运行的平台,常用的的游览器有IE(Edge).火狐 ...
- (2)用 if语句 区间判断
1 /*此例子只作为演示*/ 2 3 #include <stdio.h> 4 int main() 5 { 6 printf("请问贵公司给出的薪资是:\n"); 7 ...
- SpringBoot | 4.1 SpringMVC的自动配置
目录 前言 1. SpringMVC框架的设计与流程 1.1 SpringMVC框架的示意图 1.2 SpringMVC的组件流程 2. *自动配置的源码分析 2.1 导入Web场景启动器 2.2 找 ...
- 软件或jar包版本的小知识---Beta版、Final版、Free版等
对于各种软件或jar包,其后面总有不同的"尾巴",如: 等,刚开始接触的肯定有些不知道.那么他们到底代表什么意思呢? 0.Release:发布版 1.Beta版:产品发布之前的测试 ...
- 值得收藏 | 深度剖析 TensorCore 卷积算子实现原理
作者:章晓 | 旷视 MegEngine 架构师 一.前言 2020 年 5 月 Nvidia 发布了新一代的 GPU 架构安培(Ampere).其中和深度学习关系最密切的莫过于性能强劲的第三代的 T ...