简单工厂模式---商场收费系统

本文通过分析商场收银软件的需求,展示了如何利用简单工厂模式实现不同的打折促销方式。设计包括用户输入商品单价和数量,计算费用,显示商品清单和总计。简单工厂模式通过CashFactory类调度不同打折策略,每个策略类继承自CashSuper抽象类。然而,该模式在商场打折规则频繁变化时需要频繁修改工厂类,存在维护和扩展的问题。作者指出,对于算法的动态变化,还有更优的设计模式可供探索。
摘要由CSDN通过智能技术生成

商场收银软件分析:要求实现不同的打折促销方式,所以可以采用上次学的简单工厂模式来做。

用两个文本框输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,再用一个重置按钮来重新开始。

使用简单工厂的模式实现,把商场可能的打折都做成下拉选择框的项。就可以实现了。

类图解释:写一个CashFactory类来做不同打折方式的分支,在其中调用不同的打折方法,

用一个CashSuper来作为虚方法,用于得到结果,然后把不同的打折方式写成不同的类,继承当前的CashSuper,这样,如果要修改任何一种打折方式,就不需要提供其他算法的代码了。





现金收费工厂类:

    public class CashFactory
    {
        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 "打八折":
                    cs = new CashRebate("0.8");
                    break;
            }
            return cs;
        }
    }


CashSuper类
    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 = 1d;
        public CashRebate(string moneyRebate)
        { this.moneyRebate = double.Parse(moneyRebate); }
        public override double acceptCash(double money)
        {
            return money * moneyRebate;
        }
    }
    public class CashReturn : CashSuper
    {
        private double moneyCondition = 0.0d;
        private double moneyReturn = 0.0d;

        public CashReturn(string moneyCondition,string moneyReturn)
        {
            this.moneyReturn = double.Parse(moneyReturn);
            this.moneyCondition = double.Parse(moneyCondition);
        }
        public override double acceptCash(double money)
        {
            double result = money;
            if (money >= moneyCondition)
                result = money - Math.Floor(money / moneyCondition) * moneyReturn;

            return result;
        } 
    }


Form设计:

        private void buttonConfirm_Click(object sender, EventArgs e)
        {
            double total = 0.0d;
            CashSuper csuper = CashFactory.createCashAccept(comboBox1.SelectedItem.ToString());
            double totalPrices = 0d;
            totalPrices = csuper.acceptCash(Convert.ToDouble(textBoxSinglePrice.Text) * Convert.ToDouble(textBoxAmount.Text));
            total = total + totalPrices;
            richTextBoxDisplay.Text = "单价:" + textBoxSinglePrice.Text + "\n" + "数量:" + textBoxAmount.Text + "\n" + "合计:  "  +totalPrices.ToString();
            labelSummary.Text = "合计" + total.ToString();
        }

        private void buttonReset_Click(object sender, EventArgs e)
        {
            textBoxAmount.Text = "";
            textBoxSinglePrice.Text = "";
            richTextBoxDisplay.Text = "";
            comboBox1.Text = "正常收费";
        }





但是简单工厂的模式有一个问题:虽然能解决这个问题,这个模式只是解决对象创建的问题,而且由于工厂本身包括了所有的收费方式,商场是可能经常性地更改打折额度和返利额度,每次维护或扩展收费方式都要改动这个工厂,以至于代码需要重新编译部署。这真是一个很糟糕的处理方式,所以它不是最好的办法。面对算法的时常变动,应该有更好的办法。下次去研究一下其他的设计模式,应该会找到更好的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值