TUTORIAL

Object Pooling in .NET

Posted by Santhosh Veeraraman Tutorials | C# Language September 04, 2007
This article shall describe how to implement object pooling in .NET. Object Pooling is something that tries to keep a pool of objects in memory to be re-used later and hence it will reduce the load of object creation to a great extent. This article will try to explain this in detail.
Reader Level:

Object Pooling:

 

Object Pooling is something that tries to keep a pool of objects in memory to be re-used later and hence it will reduce the load of object creation to a great extent. This article will try to explain this in detail. The example is for an Employee object, but you can make it general by using Object base class.

 

What does it mean?

 

Object Pool is nothing but a container of objects that are ready for use. Whenever there is a request for a new object, the pool manager will take the request and it will be served by allocating an object from the pool.

 

How it works?

 

We are going to use Factory pattern for this purpose. We will have a factory method, which will take care about the creation of objects. Whenever there is a request for a new object, the factory method will look into the object pool (we use Queue object). If there is any object available within the allowed limit, it will return the object (value object), otherwise a new object will be created and give you back.

 

The below code is just an example to give you an idea, and is neither tested nor error-proof. You can modify it as you wish: up-to your creativity.

 

Code 1: Object Pool and Employee class.

 

using System;

using System.Collections;

 

namespace ObjectPooling

{

    class Factory

    {

        // Maximum objects allowed!

        private static int _PoolMaxSize = 2;

 

        // My Collection Pool

        private static readonly Queue objPool = new Queue(_PoolMaxSize);  

 

        public Employee GetEmployee()

        {

            Employee oEmployee;

 

            // check from the collection pool. If exists return object else create new

            if (Employee.Counter >= _PoolMaxSize && objPool.Count>0)

            {

                // Retrieve from pool

                oEmployee = RetrieveFromPool();

            }

            else

            {

                oEmployee = GetNewEmployee();

            }

            return oEmployee;

        }

 

        private Employee GetNewEmployee()

        {

            // Creates a new employee

            Employee oEmp = new Employee();

            objPool.Enqueue(oEmp);

            return oEmp;

        }

       

        protected Employee RetrieveFromPool()

        {

            Employee oEmp;

 

            // if there is any objects in my collection

            if (objPool.Count>0)

            {

                oEmp = (Employee)objPool.Dequeue();

                Employee.Counter--;

            }

            else

            {

                // return a new object

                oEmp = new Employee();

            }

            return oEmp;

        }

    }

 

    class Employee

    {

        public static int Counter = 0;

        public Employee()

        {

            ++Counter;

        }

 

        private string _Firstname;

        public string Firstname

        {

            get

            {

                return _Firstname;

            }

            set

            {

                _Firstname = value;

            }

       

    }

}

 

Code 2: How to use it?

 

private void button1_Click(object sender, EventArgs e)

{

    Factory fa = new Factory();

 

    Employee myEmp = fa.GetEmployee();

    Console.WriteLine("First object");

 

    Employee myEmp1 = fa.GetEmployee();

    Console.WriteLine("Second object")

}

COMMENT USING