简单工厂模式
从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。
以商场促销为例 UML图如下
实现代码:
//现金收费抽象类
abstract class CashSuper
{
public abstract double acceptCash(double money);//现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价
}
//正常收费子类
class CashNormal : CashSuper
{
public override double acceptCash(double money)
{
return money ;//正常收费,原价返回
}
}
//打折收费子类
class CashRebate : CashSuper
{
private double moneyRebate = 1d;
public CashRebate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);//打折收费,初始化时,必须输入折扣率,如八折,就是0.8
}
public override double acceptCash(double money)
{
return money * moneyRebate;
}
}
//返利收费子类
class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public CashReturn(string moneyCondition, string moneyReturn)//返利收费,初始化时必须输入返利条件和返利值
{
this.moneyCondition =double.Parse (moneyCondition );
this.moneyReturn =double.Parse (moneyReturn );
}
public override double acceptCash(double money)
{
double result=money ;
if (money >= moneyCondition)//若大于返利条件,则需要减去返利值
result = money - Math.Floor(money / moneyCondition) * moneyReturn;
return result;
}
}
//现金收取工厂
class CashFactory
{
public static CashSuper createCashAccept(string type)
{
CashSuper cs = null;
//根据条件返回相应的对象
switch (type)
{
case "正常收费":
cs =new CashNormal ();
break ;
case "满300返100":
CashReturn cr1=new CashReturn ("300","100");
cs =cr1;
break ;
case "打8折":
CashRebate cr2=new CashRebate ("0.8");
cs =cr2;
break ;
}
return cs;
}
}
//客户端窗体程序
double total = 0.0d;
private void btnOK_Click(object sender, EventArgs e)
{
CashSuper csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());//利用简单工厂模式根据下拉选择框,生成相应的对象
double totalPrice=0d;
totalPrice =csuper .acceptCash (Convert .ToDouble (txtPrice.Text))*Convert .ToDouble (txtNum .Text );
total =total +totalPrice ;
lbxList.Items .Add ("单价:"+txtPrice .Text +"数量:"+txtNum .Text +""+cbxType.SelectedItem +"合计:"+totalPrice .ToString ());//通过多态可以得到收取费用的结果
lblResult .Text =total .ToString ();
}
private void Form1_Load(object sender, EventArgs e)
{
cbxType.Items.Add("正常收费");
cbxType.Items.Add("满300返100");
cbxType.Items.Add("打8折");
}
通过下面介绍策略模式对比出简单工厂模式的的优缺点!