第一部分·创建型模式-03-建造者模式(Builder)

2023-12-13  本文已影响0人  玄德公笔记

1. 概念

1.1 角色

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

1.2 类图

image.png
classDiagram
  Product <.. ConcreteBuilder
  Builder <|.. ConcreteBuilder
   Director o--> Builder
  class Product{
  }
  class Builder{
  <<interface>>
    +BuildPartA(param:Parameter)
    +BuildPartB(param:Parameter)
  }
 class ConcreteBuilder{
    +product:*Product 
    +BuildPartA(param:Parameter)
    +BuildPartB(param:Parameter) 
    +GetProduct():Product
}
  class Director{
   +builder:Builder
   +Construct(param:Parameter)
}

2. 代码示例

2.1 设计

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 类图

image.png
classDiagram
  Product <.. ConcreteBuilder
  Builder <|.. ConcreteBuilder
   Director o--> Builder
  class Product{
    +Name:String
    +PartA:String 
    +PartB:String 
  }
  class Builder{
  <<interface>>
  + CreateProduct():*Product
  +BuildPartA(p:string)
  +BuildPartB(p:string)
  }
 class ConcreteBuilder{
   + CreateProduct():*Product
    +BuildPartA(p:string)
    +BuildPartB(p:string) 
    +GetProduct()
}
  class Director{
   +Builder builder
   +Construct()
}

上一篇 下一篇

猜你喜欢

热点阅读