提取工厂类:使用一个简单工厂类来新建对象实例。
举例理解:对于一个客户端事件,我们可能需要初始化一个对象实例,并调用其中的几个方法做一系列的操作。如果客户端事件经常需要扩展,那可能每次初始化的对象实例可能都是不同的,那么为了把这个初始化对象的动作封装起来,为了使这个行为更加便于维护,我们就需要把初始化对象的动作交给简单工厂类来统一完成。
项目实例:做过一个小型的购物商城。其中有个需求简述如下:管理员可以通过后台自助增删改当前商品的打折比例和打折类型。一开始我们想的都很简单,以为用户仅仅是打折而已,OK,加个下拉列表然后里面放上1-9折就行了,然后售价X这个折数就好了。想不到设计好后,当时就被驳回了,客户说我们不仅仅会打折,可能还会返点。客户的需求向来是多变的,不能要求需求不变,那只有在设计上改变了。先看看现在项目中的设计吧,具体代码忘了,下面的代码大部分引自博客园上一大牛的文章,因为情况差不多,引来用一下,说明道理就好了。
另注:简单工厂应对一些简单逻辑比较适用,并不适合一些逻辑比较复杂的应用。
下面直接贴出经过重构的代码:
abstract class SuperCash
{
public abstract double 0;"> 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();
}