1 from abc import ABCMeta
2 from copy import deepcopy
3 from pypat.behavioral.memento import Originator
4
5
6 -class Reusable(Originator, metaclass=ABCMeta):
7 """
8 An abstract reusable class.
9
10 - External Usage documentation: U{https://github.com/tylerlaberge/PyPatterns/wiki/Creational-Pattern-Usage}
11 - External Object Pool Pattern documentation: U{https://en.wikipedia.org/wiki/Object_pool_pattern}
12 """
14 """
15 Initialize a new Reusable instance.
16 """
17 self.memento = self.commit()
18
26
27
29 """
30 An Object Pool design pattern implementation.
31
32 - External Usage documentation: U{https://github.com/tylerlaberge/PyPatterns/wiki/Creational-Pattern-Usage}
33 - External Object Pool Pattern documentation: U{https://en.wikipedia.org/wiki/Object_pool_pattern}
34 """
35 - def __init__(self, reusable_class, *args, **kwargs):
36 """
37 Initialize a new object pool instance.
38
39 @param reusable_class: The reusable class this object pool is responsible for.
40 @param args: args for reusable object creation.
41 @param kwargs: kwargs for reusable object creation.
42 """
43 self.reusables = list()
44 self.reusable_class = reusable_class
45 self.args = args
46 self.kwargs = kwargs
47 self.pool_size = 2
48 self._expand(self.pool_size)
49
51 """
52 Acquire an object from the pool.
53
54 @return: An object from the pool.
55 """
56 try:
57 reusable = self.reusables.pop()
58 except IndexError:
59 self._expand(self.pool_size)
60 reusable = self.reusables.pop()
61
62 return reusable
63
65 """
66 Release an object back into the pool.
67
68 @param reusable: The object to return to the pool.
69 """
70 reusable.reset()
71 self.reusables.append(reusable)
72
74 for i in range(0, size):
75 self.reusables.append(self.reusable_class(*self.args, **self.kwargs))
76