go語言設計模式 - 建造者模式

1、目錄

2、簡介

1. 解決的問題

Builder模式將複雜對象的構造與其表示分離開來,以便相同的構造過程能夠建立不一樣的表示。bash

3、實現

1. 文件結構

.
├── car
│   └── car.go
├── demoBuilder
│   └── demoBuilder.go
└── main.go
複製代碼

2. 具體實現

./car/car.goui

package car

type Speed float64

const (
	MPH Speed = 1
	KPH       = 1.60934
)

type Color string

const (
	BlueColor  Color = "blue"
	GreenColor       = "green"
	RedColor         = "red"
)

type Wheels string

const (
	SportsWheels Wheels = "sports"
	SteelWheels         = "steel"
)

type Builder interface {
	SetColor(Color) Builder
	SetWheels(Wheels) Builder
	SetTopSpeed(Speed) Builder
	Build() Interface
}

type Interface interface {
	Drive() error
	Stop() error
}
複製代碼

./demoBuilder/demoBuilder.gospa

package demoBuilder

import (
	"fmt"
	"study/test/7/car"
)

type demoBuilder struct {
	name   string
	color  car.Color
	wheels car.Wheels
	speed  car.Speed
}

func NewBuilder(name string) demoBuilder {
	return demoBuilder{name: name}
}

type OptCarA struct {
	car demoBuilder
}

func (o OptCarA) Drive() error {
	fmt.Printf("The %s, %s, %f car is moving. builder is %s.\n",
		o.car.color, o.car.wheels, o.car.speed, o.car.name)
	return nil
}

func (o OptCarA) Stop() error {
	fmt.Printf("The %s, %s, %f car has stopped. builder is %s.\n",
		o.car.color, o.car.wheels, o.car.speed, o.car.name)
	return nil
}

func (c demoBuilder) SetColor(color car.Color) demoBuilder {
	c.color = color
	return c
}

func (c demoBuilder) SetWheels(wheels car.Wheels) demoBuilder {
	c.wheels = wheels
	return c
}

func (c demoBuilder) SetTopSpeed(speed car.Speed) demoBuilder {
	c.speed = speed
	return c
}

func (c demoBuilder) Build() OptCarA {
	fmt.Printf("build finish\n")
	return OptCarA{car: c}
}
複製代碼

./main.gocode

package main

import (
	"study/test/7/car"
	"study/test/7/demoBuilder"
)

func main() {
	assembly := demoBuilder.NewBuilder("myCarBuilder").SetColor(car.RedColor)

	familyCar := assembly.SetWheels(car.SportsWheels).SetTopSpeed(50 * car.MPH).Build()
	familyCar.Drive()
	familyCar.Stop()

	sportsCar := assembly.SetWheels(car.SteelWheels).SetTopSpeed(150 * car.MPH).Build()
	sportsCar.Drive()
	sportsCar.Stop()
}
複製代碼

3. 運行

[root@localhost gopath]# go run main.go 
build finish
The red, sports, 50.000000 car is moving. builder is myCarBuilder.
The red, sports, 50.000000 car has stopped. builder is myCarBuilder.
build finish
The red, steel, 150.000000 car is moving. builder is myCarBuilder.
The red, steel, 150.000000 car has stopped. builder is myCarBuilder.
複製代碼
相關文章
相關標籤/搜索