Files
PyPattyrn/pypat/creational/pool.py
2016-09-10 17:11:45 -04:00

74 lines
2.0 KiB
Python

from abc import ABCMeta
from copy import deepcopy
from pypat.behavioral.memento import Originator
class Reusable(Originator, metaclass=ABCMeta):
"""
An abstract reusable class.
External Object Pool Pattern documentation: U{https://en.wikipedia.org/wiki/Object_pool_pattern}
"""
def __init__(self):
"""
Initialize a new Reusable instance.
"""
self.memento = self.commit()
def reset(self):
"""
Reset this objects state to the state that it was created with.
"""
memento = self.memento
self.rollback(deepcopy(memento))
self.memento = memento
class Pool(object):
"""
An Object Pool design pattern implementation.
External Object Pool Pattern documentation: U{https://en.wikipedia.org/wiki/Object_pool_pattern}
"""
def __init__(self, reusable_class, *args, **kwargs):
"""
Initialize a new object pool instance.
@param reusable_class: The reusable class this object pool is responsible for.
@param args: args for reusable object creation.
@param kwargs: kwargs for reusable object creation.
"""
self.reusables = list()
self.reusable_class = reusable_class
self.args = args
self.kwargs = kwargs
self.pool_size = 2
self._expand(self.pool_size)
def acquire(self):
"""
Acquire an object from the pool.
@return: An object from the pool.
"""
try:
reusable = self.reusables.pop()
except IndexError:
self._expand(self.pool_size)
reusable = self.reusables.pop()
return reusable
def release(self, reusable):
"""
Release an object back into the pool.
@param reusable: The object to return to the pool.
"""
reusable.reset()
self.reusables.append(reusable)
def _expand(self, size):
for i in range(0, size):
self.reusables.append(self.reusable_class(*self.args, **self.kwargs))