Skip to content

Commit

Permalink
creational/builder: implement the builder pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
tmrts committed Feb 22, 2017
1 parent 4595241 commit e7af050
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 1 deletion.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ A curated collection of idiomatic design & application patterns for Go language.
| Pattern | Description | Status |
|:-------:|:----------- |:------:|
| [Abstract Factory](/creational/abstract_factory.md) | Provides an interface for creating families of releated objects ||
| [Builder](/creational/builder.md) | Builds a complex object using simple objects | |
| [Builder](/creational/builder.md) | Builds a complex object using simple objects | |
| [Factory Method](/creational/factory.md) | Defers instantiation of an object to a specialized function for creating instances ||
| [Object Pool](/creational/object-pool.md) | Instantiates and maintains a group of objects instances of the same type ||
| [Singleton](/creational/singleton.md) | Restricts instantiation of a type to one object ||
Expand Down
61 changes: 61 additions & 0 deletions creational/builder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# Builder Pattern

Builder pattern separates the construction of a complex object from its
representation so that the same construction process can create different
representations.

In Go, normally a configuration struct is used to achieve the same behavior,
however passing a struct to the builder method fills the code with boilerplate
`if cfg.Field != nil {...}` checks.

## Implementation

```go
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 {
Color(Color) Builder
Wheels(Wheels) Builder
TopSpeed(Speed) Builder
Build() Interface
}

type Interface interface {
Drive() error
Stop() error
}
```

## Usage

```go
assembly := car.NewBuilder().Paint(car.RedColor)

familyCar := assembly.Wheels(car.SportsWheels).TopSpeed(50 * car.MPH).Build()
familyCar.Drive()

sportsCar := assembly.Wheels(car.SteelWheels).TopSpeed(150 * car.MPH).Build()
sportsCar.Drive()
```

0 comments on commit e7af050

Please sign in to comment.