提取工厂类:使用一个简单工厂类来新建对象实例。
举例理解:对于一个客户端事件,我们可能需要初始化一个对象实例,并调用其中的几个方法做一系列的操作。如果客户端事件经常需要扩展,那可能每次初始化的对象实例可能都是不同的,那么为了把这个初始化对象的动作封装起来,为了使这个行为更加便于维护,我们就需要把初始化对象的动作交给简单工厂类来统一完成。
项目实例:做过一个小型的购物商城。其中有个需求简述如下:管理员可以通过后台自助增删改当前商品的打折比例和打折类型。一开始我们想的都很简单,以为用户仅仅是打折而已,OK,加个下拉列表然后里面放上1-9折就行了,然后售价X这个折数就好了。想不到设计好后,当时就被驳回了,客户说我们不仅仅会打折,可能还会返点。客户的需求向来是多变的,不能要求需求不变,那只有在设计上改变了。先看看现在项目中的设计吧,具体代码忘了,下面的代码大部分引自博客园上一大牛的文章,因为情况差不多,引来用一下,说明道理就好了。
另注:简单工厂应对一些简单逻辑比较适用,并不适合一些逻辑比较复杂的应用。
下面直接贴出经过重构的代码:
相关抽象类
abstract class SuperCash
{
public abstract double0;"> ReturnTotalCash(double money);
}
class NormalCash : SuperCash
{
public override double ReturnTotalCash(double money)
{
return money;
}
}
class RebateCash : SuperCash
{
private double moneyRebate = 1d;
public RebateCash(double _mRebate)
{
moneyRebate = _mRebate;
}
public override double ReturnTotalCash(double money)
{
return money * moneyRebate;
}
}
class ReturnCash : SuperCash
{
private double moneyCondition = 0.0d;
private double moneyReturn = 0.0d;
public ReturnCash(double _mCondition, double _mReturn)
{
moneyCondition = _mCondition;
moneyReturn = _mReturn;
}
public override double ReturnTotalCash(double money)
{
if (money > moneyCondition)
{
return money - moneyReturn;
}
return money;
}
}
现金消费工厂
class CashFactory
{
public static SuperCash CreateSuperCash(string type)
{
SuperCash superCash = null;
switch (type)
{
case "Normal":
superCash = new NormalCash();
break;
case "80% Off":
superCash = new RebateCash(0.8);
break;
case "50% Off":
superCash = new RebateCash(0.5);
break;
case "100 Per 300":
superCash = new ReturnCash(300, 100);
break;
}
return superCash;
}
}
调用的事件
protected void btnTotal_Click(object sender, EventArgs e)
{
string type = ddlType.SelectedItem.Value;
SuperCash superCash = CashFactory.CreateSuperCash(type);
double total = superCash.ReturnTotalCash(Convert.ToDouble(txtPrice.Text)*Convert.ToDouble(txtNum.Text));
lbTotal.Text = total.ToString();
}