Skip to main content

Abstract Factory Design Pattern

Abstract Factory :return families of related or dependent objects without specifying their concrete classes.


  • AbstractFactory- IVehicle
  • ConcreteFactory - Maruti, Honda
  • AbstractProduct- IDiesel, IPetrol
  • Product- DezirePetrol, ZenDiesel, AmazeDiesel, CityPetrol
  • Client-This is a class which uses AbstractFactory and AbstractProduct interfaces to create a family of related objects
Implementation is pretty much straight forward: Since now you have good understanding of Factory, there is nothing much to explain.



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AbstractFactory
{
    class Program
    {
        static void Main(string[] args)
        {
            IVehicle marutiVehicle = new Maruti();
            CarClient marutiClient = new CarClient(marutiVehicle);
            Console.WriteLine("********* MARUTI **********");
            Console.WriteLine(marutiClient.GetDieselModelDetails());
            Console.WriteLine(marutiClient.GetPetrolModelDetails());
            IVehicle hondaMobilePhone = new Honda();
            CarClient hondaClient = new CarClient(hondaMobilePhone);
            Console.WriteLine("******* HONDA **********");
            Console.WriteLine(hondaClient.GetDieselModelDetails());
            Console.WriteLine(hondaClient.GetPetrolModelDetails());
            Console.ReadKey();
        }
    }
    public interface IVehicle
    {
        IDieselVehicle GetDieselVehicle();
        IPetrolVehicle GetPetrolVehicle();
    }
    public interface IPetrolVehicle
    {
        string GetModelDetails();
    }
    public interface IDieselVehicle
    {
        string GetModelDetails();
    }
    public class Maruti : IVehicle
    {
        public IDieselVehicle GetDieselVehicle()
        {
            return new DezirePetrol();
        }
        public IPetrolVehicle GetPetrolVehicle()
        {
            return new ZenDiesel();
        }
    }
    public class ZenDiesel : IPetrolVehicle
    {
        public string GetModelDetails()
        {
            return "Maruti Zen Diesel Variant";
        }
    }
    public class DezirePetrol : IDieselVehicle
    {
        public string GetModelDetails()
        {
            return "Maruti Swift Dezire Petrol Variant";
        }
    }
    public class Honda : IVehicle
    {
        public IDieselVehicle GetDieselVehicle()
        {
            return new AmazeDiesel();
        }
        public IPetrolVehicle GetPetrolVehicle()
        {
            return new CityPetrol();
        }
    }
    public class CityPetrol : IPetrolVehicle
    {
        public string GetModelDetails()
        {
            return "Honda City Petrol Variant";
        }
    }
    public class AmazeDiesel : IDieselVehicle
    {
        public string GetModelDetails()
        {
            return "Amaze Diesel Variant";
        }
    }
    public class CarClient
    {
        IPetrolVehicle petrolVehicle;
        IDieselVehicle dieselVehicle;
        public CarClient(IVehicle factory)
        {
            petrolVehicle = factory.GetPetrolVehicle();
            dieselVehicle = factory.GetDieselVehicle();
        }
        public string GetPetrolModelDetails()
        {
            return petrolVehicle.GetModelDetails();
        }
        public string GetDieselModelDetails()
        {
            return dieselVehicle.GetModelDetails();
        }
    }
}


Comments

Popular posts from this blog

Database Factory Design Pattern C#

Many developers has confusion on how to write database code in application. I will discuss several approaches here and try to provide explanation on each approach. Approach 1 : Easiest approach which is very straight forward which will work absolutely fine. The issues we will get to manage the project in terms of software principles. Like if you going to change Database provider, you would need to change using statements and other issue like mixing Database code with business logic etc. I will not go in detail here, I am assuming you already have an understanding of design principles. I am just exploring different approaches to achieve the database connectivity. using System.Collections.Generic; using System.Data.SqlClient; namespace DatabaseFactory {     class Program     {         static void Main(string[] args)         {             var employees = SomeDabOperation();   ...

Dependency Injection and Inversion Of Control C# - Par 1 (Concept )

Dependency Injection is one of the SOLI" D " principle which helps to decouple the code by making sure that we should depend on abstractions not in implementation of concrete classes. The concept is Inversion of control. Inversion Of Control It was considered as a programming style used to invert the flow of control. In Procedural language a code that consumes dependent code is in control of the process i.e.  It knows what exactly what method to use and sometimes most like what the implementation is. To achieve some goal one class need to consume some other class now question is the consumer class really needs to know about dependency on dependent class ? It is enough for a consumer class to know the properties, behavior etc. of the dependent class rather than knowing which is the dependent class having those properties, behavior etc.. I mean , we can abstract the behavior which is required to use by a consumer in the dependent class and allowing a consumer...