mirror of
https://github.com/tmrts/go-patterns.git
synced 2024-11-23 13:36:08 +03:00
creational/builder: implement the builder pattern
This commit is contained in:
parent
4595241f77
commit
e7af050223
@ -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 | ✔ |
|
||||
|
61
creational/builder.md
Normal file
61
creational/builder.md
Normal file
@ -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()
|
||||
```
|
Loading…
Reference in New Issue
Block a user