Saturday, 23 August 2014

Design Pattern: Abstract Factory


Participants

·         AbstractFactory: declares an interface for operations that create abstract products
·         ConcreteFactory: implements the operations to create concrete product objects
·         AbstractProduct: declares an interface for a type of product object
·         Product: defines a product object to be created by the corresponding concrete factory implements theAbstractProduct interface
·         Client: uses interfaces declared by AbstractFactory and AbstractProduct classes


Points to remember about abstract Factory :

Ø  AbstractFactory class declares only an interface for creating the products. The actual creation is the task of the ConcreteProduct classes, where a good approach is applying the Factory Method design pattern for each product of the family.
Ø  Extending factories can be done by using one Create method for all products and attaching information about the type of product needed.


Where to use abstract factory :


Ø  The system needs to be independent from the way the products it works with are created.
Ø  The system is or should be configured to work with multiple families of products.
Ø  A family of products is designed to work only all together.
Ø  The creation of a library of products is needed, for which is relevant only the interface, not the implementation, too.










Step wise creation
Ø  Step 1: Define Abstract Product
Ø  Step 2: Define Abstract Factory
Ø  Step 3: Define Concrete Products
Ø  Step 4: Define Concrete Factory
Ø  Step 5: Define Client

Implimentation


    //Step 1: Define Abstract Product

    // Abstract Products
    interface ITwoGService
    {
        string LowSpeedInternet();
    }

    // Abstract Products
    interface IThreeGService
    {
        string HighSpeedInternet();
    }



    //Step 2: Define Abstract Factory

    //Abstract Factory
    interface ISeviceProvider
    {
        ITwoGService GetInternetSlowService();
        IThreeGService GetInternetFastService();
    }


    //Step 3: Define Concrete Products


    //Concrete Products
    class LowSpeedInternetIdea : ITwoGService
    {


        string ITwoGService.LowSpeedInternet()
        {
            return "Low Speed Service 4MPS";
        }
    }


    //Concrete Products
    class HighInternetIdea : IThreeGService
    {


        public string HighSpeedInternet()
        {
            return "High Speed Service 10MPS";
        }
    }


    //Concrete Products
    class LowSpeedInternetAirtel : ITwoGService
    {


        string ITwoGService.LowSpeedInternet()
        {
            return "Low Speed Service 4MPS";
        }
    }


    //Concrete Products
    class HighInternetAirtel : IThreeGService
    {


        public string HighSpeedInternet()
        {
            return "High Speed Service 10MPS";
        }
    }


    //Step 4: Define Concrete Factory


    //Concrete Factory
    class AirtelFactory : ISeviceProvider
    {

        public ITwoGService GetInternetSlowService()
        {
            return new LowSpeedInternetAirtel();
        }

        public IThreeGService GetInternetFastService()
        {
            return new HighInternetAirtel();
        }



    }

    //Concrete Factory
    class IdeaFactory : ISeviceProvider
    {
        public ITwoGService GetInternetSlowService()
        {
            return new LowSpeedInternetIdea();
        }

        public IThreeGService GetInternetFastService()
        {
            return new HighInternetIdea();
        }
    }



    //Step 5: Define Client

    enum ServiceProviders
    {
        Idea,
        Airtel
    }


    class MobileInternetServiceProvider
    {
        IThreeGService two;
        ITwoGService threeg;
        ISeviceProvider factory;
        ServiceProviders manu;

        public MobileInternetServiceProvider(ServiceProviders m)
        {
            manu = m;
        }

        public void CheckProducts()
        {
            switch (manu)
            {
                case ServiceProviders.Idea:
                    factory = new IdeaFactory();
                    break;
                case ServiceProviders.Airtel:
                    factory = new AirtelFactory();
                    break;

            }

            Console.WriteLine(manu.ToString() + ":\n Low Speed Internet: " +
            factory.GetInternetSlowService().LowSpeedInternet() + "\n High Speed Internet: " + factory.GetInternetFastService().HighSpeedInternet());
        }
    }


    class Program
    {
        static void Main(string[] args)
        {

            MobileInternetServiceProvider checker = new MobileInternetServiceProvider(ServiceProviders.Airtel);

            checker.CheckProducts();

            checker = new MobileInternetServiceProvider(ServiceProviders.Idea);

            checker.CheckProducts();
        }
    }


No comments:

Post a Comment