当前位置: 首页 > news >正文

《golang设计模式》第一部分·创建型模式-03-建造者模式(Builder)

文章目录

  • 1. 概念
    • 1.1 角色
    • 1.2 类图
  • 2. 代码示例
    • 2.1 设计
    • 2.2 代码
    • 2.3 类图

1. 概念

1.1 角色

  • Builder(抽象建造者):给出一个抽象接口,以规范产品对象的各个组成成分的建造。
  • ConcreteBuilder(具体建造者):它们在应用程序调用下创建产品的实例
  • Director(导演者):调用具体建造者角色以创建产品对象。

它没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者。

  • Product(产品):产品便是建造中的复杂对象。

1.2 类图

Product
ConcreteBuilder
+*Product product
+BuildPartA()
+BuildPartB()
Builder
+BuildPartA()
+BuildPartB()
Director
+Builder builder
+Construct()

2. 代码示例

2.1 设计

  • 定义一个产品Product,它包含PartAPartB两个成员
  • 定义一个抽象建造者Builder
    • 它有BuildPartA()BuildPartB()两个方法
  • 定义具体建造者ConcreteBuilder
    • 它依赖产品Product
    • 它有BuildPartA()BuildPartB()两个方法,分别用来创建Product的两个部分。
  • 定义导演者Director
    • 它关联了建造者Builder
    • 它的Construct()方法调用建造者创建产品
  • 调用
    • 实例化一个产品 product
    • 实例化一个建造者builder,它依赖产品实例product
    • 实例化一个导演者director,它关联建造者builder
    • 用导演者directorConstruct()方法创建产品
    • 打印结果检查

2.2 代码

package mainimport "fmt"// 定义产品
type Product struct {PartA stringPartB string
}// 定义抽象建造者
type Builder interface {BuildPartA(p string)BuildPartB(p string)
}// 定义具体建造者
type ConcreteBuilder struct {product *Product
}func (c *ConcreteBuilder) BuildPartA(p string) {c.product.PartA = p
}func (c *ConcreteBuilder) BuildPartB(p string) {c.product.PartB = p
}// 定义导演者
type Director struct {builder Builder
}func (d *Director) Construct(partAInfo string, partBInfo string) {d.builder.BuildPartA(partAInfo)d.builder.BuildPartB(partBInfo)
}// 测试代码
func main() {product := &Product{}builder := &ConcreteBuilder{product: product}director := &Director{builder: builder}director.Construct("刀头", "刀柄")fmt.Println(product)
}

2.3 类图

Product
+String PartA
+String PartB
ConcreteBuilder
+*Product product
+BuildPartA(p:string)
+BuildPartB(p:string)
Builder
+BuildPartA(p:string)
+BuildPartB(p:string)
Director
+Builder builder
+Construct()

在这里插入图片描述

http://www.lryc.cn/news/106619.html

相关文章:

  • git 忽略掉不需要的文件
  • 摄像机sd卡格式化怎么恢复数据?简单五步轻松解决
  • 1-4 AUTOSAR方法论--开发流程
  • Win10查询硬盘序列号
  • 减少错误和重复工作:PDM系统的智能排错功能
  • 【面试题】作用域面试题
  • 08 定时器(下)
  • C++设计模式之适配器设计模式
  • Maven项目解决cannot resolve plugin maven-deploy-plugin:2.7
  • Postgresql源码(110)分析dsm动态共享内存分配与共享内存mq实例
  • 51单片机学习--蜂鸣器播放音乐
  • 【Vue组件eval方法的使用】
  • C++ 多文件结构和编译预处理命令
  • QT实现中英文键盘
  • java中并发编程CompletableFuture和supplyAsync的用法
  • chrony服务器
  • 春秋云镜 CVE-2021-24762
  • K8s中的Service
  • [软件工程] 全局分析规格说明书模板
  • 【JAVASE】封装
  • Java多线程(四)
  • Linux 文件系统预留空间
  • 篇一:单例模式:C++中的独一无二
  • JVM之内存结构
  • C#实现结构体与字节流的相互转化
  • 用LangChain开源框架实现知识机器人
  • HCIP——前期综合实验
  • 【2023年电赛】运动目标控制与自动追踪系统(E 题)最简单实现
  • 【IMX6ULL驱动开发学习】22.IMX6ULL开发板读取ADC(以MQ-135为例)
  • 宝塔安装ModStart,快速开启高效开发之旅!