简单工厂模式说明:
当需要创建类的实例时却不知道到底应该创建哪一个类时,选择用简单工厂模式。专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。其实质是有一个工厂累根据传入的参量,动态决定应创建出哪一个累的实例。
实例说明
1.薪资管理系统
假定公司薪资分为技术人员(月薪),市场营销人员(底薪+提成),经理(年薪+股份)三种运算算法,如果我们把三种运算写在
一个类中,这样假如以后要增加兼职人员(时新)的算法,这样就必须得更改这个类,导致以前三种算法暴露。所以应该把每一种
运算算法分离开来,这样以后需要修改某一算法或者新添加一种算法,都只修改一个子类或者新添加一个类和简单工厂类,不会影
响其他的类。实例化时根据人员岗位动态创建。在此用简单工厂模式非常的合适。具体见代码及说明。
/// <summary>
/// 抽象父类:定义一个方法返回薪资值
/// </summary>
public abstract class SalaryManage
{
/// <summary>
/// 返回薪资
/// </summary>
public abstract string GetSalary();
}
/// <summary>
/// 技术人员薪资
/// </summary>
public class SalaryTech:SalaryManage
{
public override string GetSalary()
{
return "我是技术人员,我的薪资是月薪";
}
}
/// <summary>
/// 市场营销人员薪资
/// </summary>
public class SalaryMarket:SalaryManage
{
public override string GetSalary()
{
return "我是市场营销人员,我的薪资是底薪+提成";
}
}
/// <summary>
/// 经理薪资
/// </summary>
public class SalaryManager:SalaryManage
{
public override string GetSalary()
{
return "我是经理,我的薪资是年薪+股份";
}
}
/// <summary>
/// 简单工厂类:动态决定创建哪个类的实例
/// </summary>
public class SalaryFactory
{
public static SalaryManage CreateSalaryManage(string type)
{
SalaryManage sal = null;
switch (type)
{
case "技术人员":
sal = new SalaryTech();
break;
case "市场营销人员":
sal = new SalaryMarket();
break;
case "经理":
sal = new SalaryManager();
break;
}
return sal;
}
}
调用:
SalaryManage sal;
sal = SalaryFactory.CreateSalaryManage("经理");
Console.WriteLine(sal.GetSalary());
假如现在要新增加一个兼职人员(时新),此时只需要新添加一个兼职人员的类,同时修改简单工厂类即可。
/// <summary>
/// 兼职人员薪资
/// </summary>
public class SalaryParttime:SalaryManage
{
public override string GetSalary()
{
return "我是兼职人员,我的薪资是时新";
}
}
/// <summary>
/// 简单工厂类
/// </summary>
public class SalaryFactory
{
public static SalaryManage CreateSalaryManage(string type)
{
SalaryManage sal = null;
switch (type)
{
case "技术人员":
sal = new SalaryTech();
break;
case "市场营销人员":
sal = new SalaryMarket();
break;
case "经理":
sal = new SalaryManager();
break;
case "兼职人员":
sal = new SalaryParttime();
break;
}
return sal;
}
}