mirror of
https://github.com/tmrts/go-patterns.git
synced 2026-02-04 06:46:18 +00:00
creational/object-pool: reimplement the object pool pattern
This commit is contained in:
48
creational/object-pool.md
Normal file
48
creational/object-pool.md
Normal file
@@ -0,0 +1,48 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user