04 August, 2012

Abstract Factory Pattern

Abstract factory pattern is a creational design pattern. Creational design pattern is deals with object creation mechanism. Object creation mechanism is changed on the basis of problem. Abstract factory pattern provides an interface to create families of related or dependent objects without specifying their concrete class. It is identified on the basis of problem complexity. It is encapsulated the process of instantiation of family of classes. Abstract factory pattern is widely used in framework and libraries to encapsulate the family of classes.

Elements of Abstract Factory Pattern:
1.       Abstract Factory – An Interface to create families of related or dependent item object.
2.       Concrete Factory – Implement the interface to create families of related item object.
3.       Abstract Item – An interface to create concrete item object.
4.       Concrete Item – Implement the interface to create concrete item object.
5.       Client – Uses Interface (abstract Item) provided by abstract factory and access concrete object by this interface.

Implementation:
Here I implemented abstract factory pattern in International Cricket Team by C#. The UML diagram is given below.



Step 1:  Create interface for Item class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{
    /// 
    /// Interface for Item class
    /// 
    
    public interface ICricketer
    {
        string BattingStrength();
        string BowlingStrength();
        string AllroundingStrength();
        string IconPlayer();
    }
}



Step 2: Create Factory Interface
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{
    /// 
    /// A Factory interface
    /// 
    public interface ICricketerFactory
    {
        ICricketer GetCricketer(CricketerBase cricketerBase); 
    }
}


Step 3: Define the type of Base object
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Define the type of Base Object
    /// 
    public enum CricketerBase
    {
        AustralianCricketer,
        BangladeshiCricketer,
        EnglishCricketer,
        IndianCricketer,
        PakistaniCricketer
    }

}



Step 4: Create Concrete factory class for Asian Cricketer
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Concrete factory class for Asian Cricketer
    /// 
    
    public class AsianCricketerFactory : ICricketerFactory
    {

        #region ICricketerFactory Members

        public ICricketer GetCricketer(CricketerBase cricketerBase)
        {
            ICricketer objICricketer = null;

            switch (cricketerBase)
            {
                case CricketerBase.BangladeshiCricketer:
                    objICricketer = new BangladeshiCricketer();
                    break;
                case CricketerBase.IndianCricketer:
                    objICricketer = new IndianCricketer();
                    break;
                default:
                    break;
            }
            return objICricketer;
        }

        #endregion
    }
}


Step 5: Create Concrete factory class for European Cricketer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{
    /// 
    /// Concrete factory class for European Cricketer
    /// 
    
    public class EuropeanCricketerFactory : ICricketerFactory
    {

        #region ICricketerFactory Members

        public ICricketer GetCricketer(CricketerBase cricketerBase)
        {
            ICricketer objICricketer = null;

            switch (cricketerBase)
            {
                case CricketerBase.EnglishCricketer:
                    objICricketer = new EnglishCricketer();
                    break;
                default:
                    break;
            }
            return objICricketer;
        }

        #endregion
    }
}


Step 6: Create Item class for Bangladeshi Cricketer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Item class for Bangladeshi Cricketer
    /// 
    
    public class BangladeshiCricketer : ICricketer
    {
        #region ICricketer Members

        public string BattingStrength()
        {
            return "60%";
        }

        public string BowlingStrength()
        {
            return "70%";
        }

        public string AllroundingStrength()
        {
            return "85%";
        }

        public string IconPlayer()
        {
            return "Shakib Al Hasan";
        }

        #endregion
    }
}


Step 7: Create Item Class for Indian Cricketer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Item class for Indian Cricketer
    /// 
    
    public class IndianCricketer : ICricketer
    {

        #region ICricketer Members

        public string BattingStrength()
        {
            return "85%";
        }

        public string BowlingStrength()
        {
            return "60%";
        }

        public string AllroundingStrength()
        {
            return "70%";
        }

        public string IconPlayer()
        {
            return "Shachin Tendulkar.";
        }

        #endregion
    }
}


Step 8: Create Item class for Pakistani Cricketer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Item class for Pakistani Cricketer
    /// 
    
    public class PakistaniCricketer : ICricketer
    {

        #region ICricketer Members

        public string BattingStrength()
        {
            return "75%";
        }

        public string BowlingStrength()
        {
            return "85%";
        }

        public string AllroundingStrength()
        {
            return "75%";
        }

        public string IconPlayer()
        {
            return "Shahid Afridi.";
        }

        #endregion
    }
}


Step 9: Create Item class for English Cricketer

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Item class for English Cricketer
    /// 
   
    public class EnglishCricketer : ICricketer
    {

        #region ICricketer Members

        public string BattingStrength()
        {
            return "75%";
        }

        public string BowlingStrength()
        {
            return "80%";
        }

        public string AllroundingStrength()
        {
            return "70%";
        }

        public string IconPlayer()
        {
            return "Kavin Pietersen";
        }

        #endregion
    }
}


Step 10: Create a client class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AFP
{

    /// 
    /// Client Class
    /// 
    
    class Program
    {
        static void Main(string[] args)
        {
            AsianCricketerFactory objAsianFactory = new AsianCricketerFactory();
            ICricketer objIAsianCricketer = objAsianFactory.GetCricketer(CricketerBase.BangladeshiCricketer);
            Console.WriteLine("Bangladesh Cricket Team\nBatting Strength:" + objIAsianCricketer.BattingStrength());
            Console.WriteLine("Bowling Strength:" + objIAsianCricketer.BowlingStrength());
            Console.WriteLine("Allrounding Strength:" + objIAsianCricketer.AllroundingStrength());
            Console.WriteLine("Icon Player:" + objIAsianCricketer.IconPlayer());

            Console.WriteLine();

            EuropeanCricketerFactory objEuropeanFactory = new EuropeanCricketerFactory();
            ICricketer objIEuropeanCricketer = objEuropeanFactory.GetCricketer(CricketerBase.EnglishCricketer);
            Console.WriteLine("England Cricket Team\nBatting Strength:" + objIEuropeanCricketer.BattingStrength());

            Console.WriteLine("Bowling Strength:" + objIEuropeanCricketer.BowlingStrength());
            Console.WriteLine("Allrounding Strength:" + objIEuropeanCricketer.AllroundingStrength());
            Console.WriteLine("Icon Player:" + objIEuropeanCricketer.IconPlayer());


            Console.ReadLine();


        }
    }
}


Step 11: Output


3 comments:

  1. Nice example. But should be more details explanation and lack of ans of 'What and Why'. Though its nice article.

    ReplyDelete
  2. Thanks for your suggestion. I will add What and why section soon.

    ReplyDelete
  3. Jasim Uddin8/8/12 10:44 AM

    Nice article with details example. Could you please explain why Asian and European Factory?

    ReplyDelete