生成器模式

2021-02-19  本文已影响0人  小幸运Q

将复杂对象的构建(构造过程)与表示(构造方法)分离,使得同样的构建过程可以创建不同的表示。

把product和初始化方法放在concretebuilder中,然后传给director,由director定义调用的顺序还有调用哪些方法。

image.png

四种角色(5种包括客户端):

产品(Product):具体生产器要构造的复杂对象,它的各个组成部分由ConcreteBuilder生成,生成过程由Director(指导类)控制。注意该类中只提供了get方法,这个看具体需求。

抽象生成器(Builder):声明了生成器应包含的创建产品各个组成部件的方法。注意,这些方法只是生成对象的各组成部分,各方法相互独立,方法间无时序关系,也不存在“总”的生成方法。另外,Builder应包含获取生成的产品的方法。

具体生产器(ConcreteProduct):实现Builder接口的类,具体生成器将实现Builder接口所定义的方法;每种不同的产品都有一个专属的ConcreteBuilder。

指导类(Director):用于控制产品的生成过程。Director的控制对象是Builder,即通过Director实现了对各类型产品的生成过程的重用。

客户端(Client):是生成器模式的使用者。对Client来说,生成的最终产品Product的类型是明确的,生成Product所使用的具体生成器ConcreteBuilder也是明确的

image.png
package main

import "fmt"

// 包含获取产品以及配置产品的方法
type Builder interface {
    SetName(string)
    GetProduct() Product
}

type Director struct {
    // 负责指导产品的具体的生成过程
}
func (director *Director) Construct(builder Builder) {
    builder.SetName("aaa")
}

type ConcreteBuilder1 struct {
    Builder
    product Product
}
func (this *ConcreteBuilder1) SetName(name string) {
    this.product.name = name
}
func (this *ConcreteBuilder1) GetProduct() Product {
    return this.product
}

type Product struct {
    name string
}

func main() {
    director := new(Director)
    builder1 := new(ConcreteBuilder1)

    director.Construct(builder1)
    product := builder1.GetProduct()
    fmt.Println(product)
}
上一篇 下一篇

猜你喜欢

热点阅读