The Façade pattern is sometimes called and written as a class manager. It's an easy way to organize and unify numerous classes usually within the same namespace and design structure.
The Façade pattern is a high level object pulling together low level objects for simplifying application complexity.
public class Evaluate
{
public int SubmitForm()
{
List<IProduct> products = new List<IProduct>();
string productToEval = "premium";
switch (productToEval)
{
case "standard":
products.Add(new StandardProduct());
break;
case "premium":
products.Add(new PremiumProduct());
break;
case "substandard":
products.Add(new SubStandardCentralProduct());
products.Add(new SubStandardRemoteProduct());
break;
case "distributed":
products.Add(new DistributedCentralProduct());
products.Add(new DistributedRemoteProduct());
break;
}
/////////////////////////////////////////////
// THEN ADD PLUGIN PRODUCT
/////////////////////////////////////////////
products.Add(new IntegratedProduct(false));
products.Add(new ExternalProduct(false));
products.Add(new DiscontinuedProduct(false));
EvalFacade evalFacade = new EvalFacade(products, userInfo);
return evalFacade.Run();
}
}
public class EvalFacade
{
private List<IProduct> _products;
private UserInfo _userInfo;
private string _parentSerialNumber = "";
public string ParentSerialNumber
{
get { return _parentSerialNumber; }
set { _parentSerialNumber = value; }
}
public EvalFacade(List<IProduct> products, UserInfo userInfo)
{
_products = products;
_userInfo = userInfo;
}
public int Run()
{
int status = 0;
foreach (IProduct product in _products)
{
if (product != null)
{
product.AddLicense(_userInfo, this.ParentSerialNumber);
status = product.AddLicenseStatus(_userInfo);
if (status != 0)
return status;
product.AddLeadIntoCRM(_userInfo, this.ParentSerialNumber);
if (string.IsNullOrEmpty(this.ParentSerialNumber) && !string.IsNullOrEmpty(product.SerialNumber))
this.ParentSerialNumber = product.SerialNumber;
}
}
return status;
}
}