mirror of
https://github.com/tmrts/go-patterns.git
synced 2024-11-27 23:46:06 +03:00
49 lines
925 B
Markdown
49 lines
925 B
Markdown
|
# Object Pool Pattern
|
||
|
|
||
|
The object pool creational design pattern is used to prepare and keep multiple
|
||
|
instances according to the demand expectation.
|
||
|
|
||
|
## Implementation
|
||
|
|
||
|
```go
|
||
|
package pool
|
||
|
|
||
|
type Pool chan *Object
|
||
|
|
||
|
func New(total int) *Pool {
|
||
|
p := make(chan *Object, total)
|
||
|
|
||
|
for i := 0; i < total; i++ {
|
||
|
p <- new(Object)
|
||
|
}
|
||
|
|
||
|
return p
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
Given below is a simple lifecycle example on an object pool.
|
||
|
|
||
|
```go
|
||
|
p := pool.New(2)
|
||
|
|
||
|
select {
|
||
|
case obj := <-p:
|
||
|
obj.Do( /*...*/ )
|
||
|
|
||
|
p <- obj
|
||
|
default:
|
||
|
// No more objects left retry later or fail
|
||
|
return
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Rules of Thumb
|
||
|
|
||
|
- Object pool pattern is useful in cases where object initialization is more
|
||
|
expensive than the object maintenance.
|
||
|
- If there are spikes in demand as opposed to a steady demand, the maintenance
|
||
|
overhead might overweigh the benefits of an object pool.
|
||
|
- It has positive effects on performance due to object being initialized beforehand.
|