《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 main

import "fmt"

// 定义产品
type Product struct {
	PartA string
	PartB 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()

在这里插入图片描述

你可能感兴趣的:(架构设计,golang,设计模式,建造者模式,Builder,架构,创建型模式)