最近在学习大话设计模式,因为看完后也需要做练习,所以将练习搬上来,一是加深自己的印象,同时也可以和同样正在学习设计模式同学一起进步。
简单工厂模式
我们以一个示例来学习简单工厂模式,这个示例同样来源于《大话设计模式》这本书,大家有时间也可以去看看,很不错的学习资料。
示例:假设我们要做一个简单商场计费软件,这个系统要求能录入产品的数量与单价和促销模式来计算出产品的总金额。
设计的软件界面如下:
促销主要包含量以下几种方式:
1,正常收费
2,打8折
3,打5折
4,满300送50
下面开始写代码:
首先是”正常收费”,”打折”,”满就送”的三种计算方式的类
public abstract class CashSuper
{
//抽象方法,传入原始价格,返回打折或返利后的价格
public abstract double AcceptCash(double money);
}
public class CashNormal : CashSuper
{
//正常收费的类,所以的返回原始价格
public override double AcceptCash(double money)
{
return money;
}
}
public class CashRebate : CashSuper
{
private double moneyRebate = 1;
//打折收费类,进入该类的计算都有要求打折,所以在构造函数中添加了“折扣”值
public CashRebate(double _ebate)
{
this.moneyRebate = _ebate;
}
//返回原始“原始价格*折扣”后的价格
public override double AcceptCash(double money)
{
return money * moneyRebate;
}
}
public class CashRetrun : CashSuper
{
private double coditionMoney = 0;
private double returnMoney = 0;
//满额返利类,该类用于计算买满多少钱送多少钱的方式,_coditionMoney接收满多少的值,_returnMoney接收返回多少的值
public CashRetrun(double _coditionMoney, double _returnMoney)
{
this.coditionMoney = _coditionMoney;
this.returnMoney = _returnMoney;
}
public override double AcceptCash(double money)
{
if (money > coditionMoney)
{
return money - Math.Floor(money / coditionMoney) * returnMoney;
}
else
{
return money;
}
}
}
接下来是工厂类:
public class CashFactory
{
public static CashSuper CreateCashSuper(string cashtype)
{
switch (cashtype)
{
case "正常收费":
return new CashNormal();
case "打8折":
return new CashRebate(0.8);
case "打5折":
return new CashRebate(0.5);
case "满300送50":
return new CashRetrun(300, 50);
default:
return null;
}
}
}
再就是软件中”计算”这个按钮的点击事件了
private void button1_Click(object sender, EventArgs e)
{
double number = Convert.ToDouble(this.textnumber.Text.Trim());
double price = Convert.ToDouble(this.textprice.Text.Trim());
double totalprice = number * price;
CashSuper cashsuper = CashFactory.CreateCashSuper(this.cashtype.SelectedItem.ToString());
this.label7.Text = totalprice.ToString();
this.label4.Text = cashsuper.AcceptCash(totalprice).ToString();
}
这样,整个功能就利用简单工厂模式来实现了,如下图:
面向对象的编程,并是不类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。所以上面”打8折”与”打5折”都是打折类,只需要写一个类,然后将折扣率作为参数传递进类中就好了。