【寒江雪】Go实现Builder Pattern

Builder Pattern

  生成器模式将复杂对象的构造与表示分开,以便相同的构建过程可以创建不同的表示形式。

  然而在Go语言中,如果向Builder传递一个结构,代码中就会充满检查代码,判断某个字段是否为空。为了避免这种现象,我们只需要在Builder中放置一个配置结构。

实现

  我们来实现一个构造器构造一个灯的过程。

// 先定义几个类型
type Color string
type LampStatus bool
type Brand string

// 定义颜色常量
const (
    BlueColor  Color = "blue"
    GreenColor       = "green"
    RedColor         = "red"
)

// 定义品牌常量
const (
    OppleBulb Brand = "OPPLE"
    Osram           = "OSRAM"
)

//  Lamp Builder define
type Builder interface {
    Color(Color) LampBuilder
    Brand(Brand) LampBuilder
    Build() LampOperation
}

type LampBuilder struct {
    Lamp    // 配置结构
}


func (lb LampBuilder) Color(c Color) LampBuilder {
    lb.color=c
    return lb
}

func (lb LampBuilder) Brand(b Brand) LampBuilder {
    lb.brand=b
    return lb
}

func (lb LampBuilder) Build() LampOperation {
    // 新的产品产生过程
    lamp := Lamp{color: lb.color, brand: lb.brand, status: false}
    return lamp
}

func NewBuilder() Builder {
    return LampBuilder{}
}

type LampOperation interface {
    Open() error
    Close() error
    ProductionIllustrative()
}

// 灯的定义
type Lamp struct {
    color  Color
    brand  Brand
    status LampStatus
}

func (l Lamp) Open() error {
    if l.status {
        return errors.New("Lamp is opened")
    }
    fmt.Println("Open lamp.")
    l.status = true
    return nil
}

func (l Lamp) Close() error {
    if !l.status {
        return errors.New("Lamp is closed")
    }
    fmt.Println("Close lamp.")
    l.status = true
    return nil;
}

func (l Lamp) ProductionIllustrative() {
    fmt.Println("I'm a lamp.")
    fmt.Println("Color:" + l.color)
    fmt.Println("Brand:" + l.brand)
}


  使用:

func main(){
    b := builder.NewBuilder()
    lamp_1 := b.Color(builder.BlueColor).Brand(builder.Osram).Build()
    lamp_1.Open()
    lamp_1.ProductionIllustrative()

    lamp_2 := b.Color(builder.GreenColor).Brand(builder.OppleBulb).Build()
    lamp_2.ProductionIllustrative()
}



Author:寒江雪
Date:2018 03 10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值