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.
/
// customer enters their choice
//
If (choice == “Car”)
{
// call car class and it’s methods
Car c = new car();
c.buy();
}
If (choice == “bike”)
{
// call bike class and it’s methods
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 methodBuy
. There is no security at the client side. - Need to use the
new
keyword in client classes.
Solution
Problem 1
Create a new interface to depict methods, for example, in our scenario, it isBuy()
. Using this interface it will solve problems 1 and 2.//
// Interface
//
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.
//
// Factory Class
//
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;
}
}
//Business classes
//Car
public class clsBike:IChoice
{
#region IChoice Members
public string Buy()
{
return ("You choose Bike");
}
#endregion
}
//Bike
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.
//Client class
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.
No comments:
Post a Comment