Introduction
The factory pattern method is a popularly used design pattern and it is very useful to restrict clients
from knowing the actual business logic methods, it is useful
to create a decoupled system, and it is useful to eliminate object creation in a client environment.
This article explains how we can achieve these problems with a small example.
Problem
For example we have a scenario where based on user input we need to call particular class methods. I have a customer input screen. He enters
his choice whether they want to buy a bike or a car. Normally we get input from the user
and based on that will create an object in the client class and call those methods like below.
If (choice == "Car")
{
Car c = new car();
c.buy();
}
If (choice == "bike")
{
Bike b = new Bike();
b.buy()
}
...
- In case in future if there is any other vehicle added then we need to change the client functionality.
- The above client code depicts that there are classes
Car
, Bike
, and a method Buy
. There is no security at the client side. - Need to use the
new
keyword in client classes.
To avoid these problems Factory pattern is used.
Solution
Problem 1
Create a new interface to depict methods, for example, in our scenario, it is
Buy()
. Using this interface it will solve problems 1 and 2.
public interface IChoice
{
string Buy();
}
A new class will be added and this class we will be called factory class. This class sits between
the client class and the business class
and based on user choice it will return the respective class object through the interface. It will solve problem 3.
public class FactoryChoice
{
static public IChoice getChoiceObj(string cChoice)
{
IChoice objChoice=null;
if (cChoice.ToLower() == "car")
{
objChoice = new clsCar();
}
else if (cChoice.ToLower() == "bike")
{
objChoice = new clsBike();
}
else
{
objChoice = new InvalidChoice();
}
return objChoice;
}
}
public class clsBike:IChoice
{
#region IChoice Members
public string Buy()
{
return ("You choose Bike");
}
#endregion
}
public class clsCar:IChoice
{
#region IChoice Members
public string Buy()
{
return ("You choose Car");
}
#endregion
}
From the client class call the factory class object and it will return the interface object. Through
the interface object we will call the respective method.
IChoice objInvoice;
objInvoice = FactoryClass.FactoryChoice.getChoiceObj(txtChoice.Text.Trim());
MessageBox.Show(objInvoice.Buy());
In future if we need to add a new vehicle then there is no need to change the client class, simply return that object using
the factory class.
Advantages
Suppose we want to add a decoupled structure and don’t want to disturb the client environment again and again, this pattern is very useful.
The factory class will take all the burden of object creations.
Professional Summary -
1. I am a Microsoft Certified Professional with 14+ years of IT Professional experience with both Web and Windows Application using Microsoft Technologies/Tools such as ASP.NET using C#,WPF, VB.NET, Angular JS, ADO.NET, Entity Framework, Web Services, WCF Services, Restful Services, Java Script, XML, HTML, WPF, SSIS, LINQ, SSRS, Silver light and Expression Blend, Entity Framework, Visual Basic 6.0 & Classic ASP.
2. Results oriented Technology Professional with over 14 years of experience serving several roles as Architect, Lead Developer, Sr. Development Engineer and Team Lead in Projects.
3. Currently working as a Lead developer for a leading firm.
4. Scaled Microsoft Certified Technology Specialist with 8+ years in Agile – Scrum Methodology.
5. Involved in all phases of software development life cycle (SDLC) including analysis, requirement engineering, architecture design, database design, development, enhancements and maintenance of standalone, multi-tier, mobile apps, web-based, portals based object oriented enterprise applications.
6. Extensive experience in leading large teams and involved in project estimation, planning, scheduling and execution, status reporting, cross team co-ordination, issues and risks management.