Python版
https://github.com/faif/python-patterns/blob/master/creational/pool.py
#!/usr/bin/env python # -*- coding: utf-8 -*- """ *What is this pattern about? This pattern is used when creating an object is costly (and they are created frequently) but only a few are used at a time. With a Pool we can manage those instances we have as of now by caching them. Now it is possible to skip the costly creation of an object if one is available in the pool. A pool allows to 'check out' an inactive object and then to return it. If none are available the pool creates one to provide without wait. *What does this example do? In this example queue.Queue is used to create the pool (wrapped in a custom ObjectPool object to use with the with statement), and it is populated with strings. As we can see, the first string object put in "yam" is USED by the with statement. But because it is released back into the pool afterwards it is reused by the explicit call to sample_queue.get(). Same thing happens with "sam", when the ObjectPool created insided the function is deleted (by the GC) and the object is returned. *Where is the pattern used practically? *References: http://stackoverflow.com/questions/1514120/python-implementation-of-the-object-pool-design-pattern https://sourcemaking.com/design_patterns/object_pool *TL;DR80 Stores a set of initialized objects kept ready to use. """ class ObjectPool(object): def __init__(self, queue, auto_get=False): self._queue = queue self.item = self._queue.get() if auto_get else None def __enter__(self): if self.item is None: self.item = self._queue.get() return self.item def __exit__(self, Type, value, traceback): if self.item is not None: self._queue.put(self.item) self.item = None def __del__(self): if self.item is not None: self._queue.put(self.item) self.item = None def main(): try: import queue except ImportError: # python 2.x compatibility import Queue as queue def test_object(queue): pool = ObjectPool(queue, True) print('Inside func: {}'.format(pool.item)) sample_queue = queue.Queue() sample_queue.put('yam') with ObjectPool(sample_queue) as obj: print('Inside with: {}'.format(obj)) print('Outside with: {}'.format(sample_queue.get())) sample_queue.put('sam') test_object(sample_queue) print('Outside func: {}'.format(sample_queue.get())) if not sample_queue.empty(): print(sample_queue.get()) if __name__ == '__main__': main() ### OUTPUT ### # Inside with: yam # Outside with: yam # Inside func: sam # Outside func: sam