The UML class diagram for the implementation of the factory method design pattern is given below:
The classes, interfaces and objects in the above UML class diagram are as follows:
Product
This is an interface for creating the objects.
ConcreteProduct
This is a class which implements the Product interface.
Creator
This is an abstract class and declares the factory method, which returns an object of type Product.
ConcreteCreator
This is a class which implements the Creator class and overrides the factory method to return an instance of a ConcreteProduct.
C# - Implementation Code
interface Product { } class ConcreteProductA : Product { } class ConcreteProductB : Product { } abstract class Creator { public abstract Product FactoryMethod(string type); } class ConcreteCreator : Creator { public override Product FactoryMethod(string type) { switch (type) { case "A": return new ConcreteProductA(); case "B": return new ConcreteProductB(); default: throw new ArgumentException("Invalid type", "type"); } } }
Factory Method Pattern - Example
Who is what?
The classes, interfaces, and objects in the above class diagram can be identified as follows:
IFactory - Interface
Scooter & Bike - Concreate Product classes
VehicleFactory - Creator
ConcreteVehicleFactory - Concreate Creator
C# - Sample Code
using System; namespace Factory { /// <summary> /// The 'Product' interface /// </summary> public interface IFactory { void Drive(int miles); } /// <summary> /// A 'ConcreteProduct' class /// </summary> public class Scooter : IFactory { public void Drive(int miles) { Console.WriteLine("Drive the Scooter : " + miles.ToString() + "km"); } } /// <summary> /// A 'ConcreteProduct' class /// </summary> public class Bike : IFactory { public void Drive(int miles) { Console.WriteLine("Drive the Bike : " + miles.ToString() + "km"); } } /// <summary> /// The Creator Abstract Class /// </summary> public abstract class VehicleFactory { public abstract IFactory GetVehicle(string Vehicle); } /// <summary> /// A 'ConcreteCreator' class /// </summary> public class ConcreteVehicleFactory : VehicleFactory { public override IFactory GetVehicle(string Vehicle) { switch (Vehicle) { case "Scooter": return new Scooter(); case "Bike": return new Bike(); default: throw new ApplicationException(string.Format("Vehicle '{0}' cannot be created", Vehicle)); } } } /// <summary> /// Factory Pattern Demo /// </summary> class Program { static void Main(string[] args) { VehicleFactory factory = new ConcreteVehicleFactory(); IFactory scooter = factory.GetVehicle("Scooter"); scooter.Drive(10); IFactory bike = factory.GetVehicle("Bike"); bike.Drive(20); Console.ReadKey(); } } }
Factory Pattern Demo - Output
When to use it?
Subclasses figure out what objects should be created.
Parent class allows later instantiation to subclasses means the creation of an object is done when it is required.
The process of objects created is required to centralize within the application.
A class (creator) will not know what classes it will be required to create.
No comments:
Post a Comment