We already know that factory and abstract factory designing patterns both are creational design pattern, but there are some difference, let’s understand those differences with code example.
Here we define a car factory interface, which will contain all mandatory methods for defining any different type of car, for example Maruti, Honda etc.
public interface ICarFactory
{
void Drive(int miles);
}
Now let’s define Maruti car class, with implementation of method from ICarFactory interface.
public class Maruti : ICarFactory
{
public void Drive(int miles)
{
Console.WriteLine("Maruti : " + miles.ToString() + "km");
}
}
Here we define two different type of car, and all the car brand will consume these interface to create their car type.
interface IElectricCar
{
string GetCarDetails();
}
interface IPetrolCar
{
string GetCarDetails();
}
Any car brand we create, we must inherit from the interface below.
interface ICar
{
IElectricCar GetElectricCar();
IPetrolCar GetPetrolCar();
}
So far from factory and abstract factory implementation you can see the difference, that abstract factory contain abstract definition of factory design.
Create a abstract class CarFactory, Which will return abstract IFactory type method; you can have any number of methods as per your requirement.
public abstract class CarFactory
{
public abstract ICarFactory GetCar(string car);
}
Now create a concrete class inherited from the CarFactory, where the actual implementation takes place
public class ConcreteCarFactory : CarFactory
{
public override ICarFactory GetCar(string car)
{
switch (car)
{
case "maruti":
return new Maruti();
case "honda":
return new Honda();
default:
throw new ApplicationException(car + " cannot be created");
}
}
}
Now let's say we want to create cars for a brand called Maruti by using above abstract definition, se we create petrol car and electric car both.
class MarutiPetrol : IPetrolCar
{
public string GetCarDetails()
{
return "Maruti petrol details";
}
}
We have created two different type of car for the brand Maruti, MarutiPetrol and MarutiElectric.
class MarutiElectric : IElectricCar
{
public string GetCarDetails()
{
return "Maruti electric details";
}
}