Saturday, July 17, 2010

Factory Method with C# code example

Definition
The factory method pattern defines an interface for creating an object, but let subclasses decides which class to instantiate.



The Class digram



The implementation

  • Vehicle Factory :- Abstract Factory


public abstract class VehicleFactory
{
public enum VehicleType
{
Car,
Bicycle
}

public abstract Vehicle CreateVehicle(VehicleType vehicleType);

public Vehicle OrderVehicle(VehicleType vehicleType)
{
Console.WriteLine("You are Ordering a " + vehicleType);
return CreateVehicle(vehicleType);
}
}


  • Bicycle, Car Factory :- Concrete Factory



  • public class BicycleFactory : VehicleFactory
    {
    public override Vehicle CreateVehicle(VehicleType vehicleType)
    {
    Console.WriteLine("Creating a " + vehicleType);
    return new MotorBicycle();
    }
    }



    public class CarFactory : VehicleFactory
    {
    public override Vehicle CreateVehicle(VehicleType vehicleType)
    {
    Console.WriteLine("Creating a " + vehicleType);
    return new Car();
    }
    }


  • Vehicle :- Abstract Product


  • public abstract class Vehicle
    {

    private int _engineCapacity;
    private int _noOfWheels;

    public int EngineCapacity
    {
    get
    {
    return _engineCapacity;
    }
    set
    {
    _engineCapacity = value;
    }
    }

    public int NoOfWheels
    {
    get
    {
    return _noOfWheels;
    }
    set
    {
    _noOfWheels = value;
    }
    }

    public abstract void Accelerate();

    public abstract void Break();
    }


  • MotorBicycle, Car :- Concrete Product



public class MotorBicycle : Vehicle
{
public MotorBicycle()
{
base.EngineCapacity = 100;
base.NoOfWheels = 2;
}

public override void Accelerate()
{
Console.WriteLine("Accelerating with Handle");
}

public override void Break()
{
Console.WriteLine("Stopping with Handle");
}
}



public class Car : Vehicle
{
public Car()
{
base.EngineCapacity = 300;
base.NoOfWheels = 4;
}

public override void Accelerate()
{
Console.WriteLine("Accelerating with Paddle");
}

public override void Break()
{
Console.WriteLine("Stopping with Paddle");
}
}


  • Prorgam :- Cleint


class Program
{
static void Main(string[] args)
{
Console.WriteLine("Creating a Motor Bicycle");
VehicleFactory bicycleFactory = new BicycleFactory();
Vehicle motorBicycle = bicycleFactory.CreateVehicle(VehicleFactory.VehicleType.Bicycle);
Console.WriteLine("Got a " + motorBicycle.GetType() + " with EngineCapacity " + motorBicycle.EngineCapacity + " and " + motorBicycle.NoOfWheels + " wheels.");
motorBicycle.Accelerate();
motorBicycle.Break();

Console.WriteLine("");
Console.WriteLine("");

Console.WriteLine("Creating a Car");
VehicleFactory carFactory = new CarFactory();
Vehicle car = carFactory.CreateVehicle(VehicleFactory.VehicleType.Car);
Console.WriteLine("Got a " + car.GetType() + " with EngineCapacity " + car.EngineCapacity + " and " + car.NoOfWheels + " wheels.");
car.Accelerate();
car.Break();

Console.ReadLine();
}
}

2 comments:

neeraj shrivastava said...

nice explanation...

JoseTeques said...

The best explanation that I found so far about this pattern, thank you very much