简单工厂模式-商场收银系统
需求:
做一个商场收银系统:营业员根据客户所购买商品的单价和数量,并且根据商场当前的打折优化活动向客户收费。
类图:
实现:
业务逻辑:
/// <summary>
/// 现金收费的抽象类,父类。
/// </summary>
abstract class CashSuper
{
/// <summary>
/// 现金收费的抽象方法
/// </summary>
/// <param name="money">原价</param>
/// <returns>当前价格</returns>
public abstract double acceptCash(double money);
}//end CashSuper
/// <summary>
/// 正常收费子类
/// </summary>
class CashNormal : CashSuper
{
/// <summary>
/// 重写父类的收费方法
/// </summary>
/// <param name="money">原价</param>
/// <returns>当前价格</returns>
public override double acceptCash(double money)
{
return money;//原价返回
}//end acceptCash
}//end CashNormal
/// <summary>
/// 打折收费子类
/// </summary>
class CashRedbate : CashSuper
{
private double moneyRebate = 1d;//具体打几折
/// <summary>
/// 获取具体打几折
/// </summary>
/// <param name="moneyRebate">具体打几折</param>
public CashRedbate(string moneyRebate)
{
this.moneyRebate = double.Parse(moneyRebate);
}//end CashRedbate
/// <summary>
///打折的方法
/// </summary>
/// <param name="money">原价</param>
/// <returns>打折之后的价格</returns>
public override double acceptCash(double money)
{
//原价*具体打折数=打折之后的价格
return money * moneyRebate;
}//end aceptCash
}//end CashRedbate
/// <summary>
/// 返利收费子类
/// </summary>
class CashReturn : CashSuper
{
private double moneyCondition = 0.0d;//返利条件
private double moneyReturn = 0.0d;//反多少
/// <summary>
/// 返利条件初始化
/// </summary>
/// <param name="moneyCondition">返利条件</param>
/// <param name="moneyReturn">反多少</param>
public CashReturn(string moneyCondition,string moneyReturn)
{
this.moneyCondition = double.Parse(moneyCondition);//返利条件
this.moneyReturn = double.Parse(moneyReturn);//反多少
}//end CashRetur
/// <summary>
/// 返利计算方法
/// </summary>
/// <param name="money">原价</param>
/// <returns>返利之后的价格</returns>
public override double acceptCash(double money)
{
double result = money;//要返回的价格
//判断是否满足返利的要求
if (money>=moneyCondition)
{
result = money - Math.Floor(money/moneyCondition)*moneyReturn;
}//end if
return result;//返回价格
}//end AcceptCash
}//end CashReturn
/// <summary>
/// 现金收费工厂类
/// </summary>
class CashFactory
{
/// <summary>
/// 根据需要实例化对象
/// </summary>
/// <param name="type">需要实例化的对象名</param>
/// <returns>返回实例化之后的对象</returns>
public static CashSuper createCashAccept(string type )
{
CashSuper cs = null;//实例化父类
//判断选择了哪种优惠方案
switch (type)
{
case "正常收费":
cs = new CashNormal();
break;
case "满300返100":
cs = new CashReturn("300","100");
break;
case "打8折":
cs = new CashRedbate("0.8");
break;
}//end switch
return cs;//把具体实例化的类返给方法
}//end createCashAccept
}//end CashFactory
客户端:
//总价
double total = 0.0d;
private void butok_Click(object sender, EventArgs e)
{
//调用现金收费工厂,根据选择实例化对象。
CashSuper cauper = CashFactory.createCashAccept(combType.SelectedItem.ToString());
//计算价格
double totalPrices = 0d;
totalPrices = cauper.acceptCash(Convert.ToDouble(txtNumber1.Text)
*Convert.ToDouble(txtNumber2.Text));//计算方法
total = total + totalPrices;//累加
listBox1.Items.Add("单价:"+txtNumber1.Text+"数量:"+txtNumber2.Text+"\t" +
combType.SelectedItem + "合计:"+totalPrices.ToString());
lblmony.Text = total.ToString();
}
结果:
欢迎访问csdn的博客:
https://blog.csdn.net/kangshihang1998?spm=1010.2135.3001.5343