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

1. 概念

封装一个复杂对象的创建过程,并可以按步骤构造。

1.1 角色

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

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

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

1.2 类图

Product
ConcreteBuilder
+product:*Product
+BuildPartA(param:Parameter)
+BuildPartB(param:Parameter)
+GetProduct()
«interface»
Builder
+BuildPartA(param:Parameter)
+BuildPartB(param:Parameter)
Director
+builder:Builder
+Construct(param:Parameter)

2. 代码示例

2.1 设计

  • 定义一个产品Product,它包含NamePartAPartB三个成员
  • 定义一个抽象建造者Builder
    • 它的CreateProduct()方法来实例化一个产品
    • 它的BuildPartA()BuildPartB()两个方法来装配产品
  • 定义具体建造者ConcreteBuilder
    • 它实现了抽象建造者的CreateProduct()BuildPartA()BuildPartB()三个方法
    • 它有的Get()方法用来查询产品(我们这里简单写成打印产品实例)
  • 定义导演者Director
    • 它关联了建造者Builder(我们简单写一个关联,当然你也可以写成聚合)
    • 它的Construct()方法调用建造者创建产品并装配
  • 调用
    • 实例化一个建造者builder
    • 实例化一个导演者director,它关联建造者builder
    • 用导演者directorConstruct()方法创建产品
    • 使用建造者的GetProduct()方法查询产品

2.2 代码

package main

import "fmt"

type Product struct {
	Name  string
	PartA string
	PartB string
}

type Builder interface {
	CreateProduct(name string) *Product
	BuildPartA(partA string, p *Product)
	BuildPartB(partB string, p *Product)
}

type ConcreteBuilder struct {
}

func (c *ConcreteBuilder) CreateProduct(name string) *Product {
	p := new(Product)
	p.Name = name
	return p
}
func (c *ConcreteBuilder) BuildPartA(partA string, p *Product) {
	p.PartA = partA
}

func (c *ConcreteBuilder) BuildPartB(partB string, p *Product) {
	p.PartB = partB
}

func (c *ConcreteBuilder) GetProduct(product *Product) {
	fmt.Printf("%+v", product)
}

type Director struct {
	builder Builder
}

func (d *Director) Construct(name string, partAInfo string, partBInfo string) *Product {
	p := d.builder.CreateProduct(name)
	d.builder.BuildPartA(partAInfo, p)
	d.builder.BuildPartB(partBInfo, p)
	return p
}

func main() {
	builder := &ConcreteBuilder{}
	director := &Director{builder: builder}
	product := director.Construct("青龙刀", "刀头", "刀柄")
	builder.GetProduct(product)
}
  • 输出
&{Name:青龙刀 PartA:刀头 PartB:刀柄}

2.3 类图

Product
+Name:String
+PartA:String
+PartB:String
ConcreteBuilder
+CreateProduct()
+BuildPartA(p:string)
+BuildPartB(p:string)
+GetProduct()
«interface»
Builder
+CreateProduct()
+BuildPartA(p:string)
+BuildPartB(p:string)
Director
+Builder builder
+Construct()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玄德公笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值