Пример шаблона проектирования Объектный пул на языке программирования C++.
#include <string> #include <iostream> #include <list> class Resource { int value; public: Resource() { value = 0; } void reset() { value = 0; } int getValue() { return value; } void setValue(int number) { value = number; } }; /* Note, that this class is a singleton. */ class ObjectPool { private: std::list<Resource*> resources; static ObjectPool* instance; ObjectPool() {} public: /** * Static method for accessing class instance. * Part of Singleton design pattern. * * @return ObjectPool instance. */ static ObjectPool* getInstance() { if (instance == 0) { instance = new ObjectPool; } return instance; } /** * Returns instance of Resource. * * New resource will be created if all the resources * were used at the time of the request. * * @return Resource instance. */ Resource* getResource() { if (resources.empty()) { std::cout << "Creating new." << std::endl; return new Resource; } else { std::cout << "Reusing existing." << std::endl; Resource* resource = resources.front(); resources.pop_front(); return resource; } } /** * Return resource back to the pool. * * The resource must be initialized back to * the default settings before someone else * attempts to use it. * * @param object Resource instance. * @return void */ void returnResource(Resource* object) { object->reset(); resources.push_back(object); } }; ObjectPool* ObjectPool::instance = 0; int main() { ObjectPool* pool = ObjectPool::getInstance(); Resource* one; Resource* two; /* Resources will be created. */ one = pool->getResource(); one->setValue(10); std::cout << "one = " << one->getValue() << " [" << one << "]" << std::endl; two = pool->getResource(); two->setValue(20); std::cout << "two = " << two->getValue() << " [" << two << "]" << std::endl; pool->returnResource(one); pool->returnResource(two); /* Resources will be reused. * Notice that the value of both resources were reset back to zero. */ one = pool->getResource(); std::cout << "one = " << one->getValue() << " [" << one << "]" << std::endl; two = pool->getResource(); std::cout << "two = " << two->getValue() << " [" << two << "]" << std::endl; return 0; }