设计模式--简单工厂模式

  简单工厂模式 

        从设计模式的类型上来说,简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。

          简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

        以商场促销为例  UML图如下

         

      实现代码:

    

 //现金收费抽象类
     abstract class CashSuper       
    {
         public abstract double acceptCash(double money);//现金收取超类的抽象方法,收取现金,参数为原价,返回为当前价
    }
    //正常收费子类
     class CashNormal : CashSuper
     {
         public override double acceptCash(double money)
         {
             return money ;//正常收费,原价返回
         }
     }
    //打折收费子类
     class CashRebate : CashSuper
     {
         private double moneyRebate = 1d;
         public CashRebate(string moneyRebate)
         {
             this.moneyRebate = double.Parse(moneyRebate);//打折收费,初始化时,必须输入折扣率,如八折,就是0.8
         }
         public override double acceptCash(double money)
         {
             return money * moneyRebate;
         }
     }
    //返利收费子类
     class CashReturn : CashSuper
     {
         private double moneyCondition = 0.0d;
         private double moneyReturn = 0.0d;
         public CashReturn(string moneyCondition, string moneyReturn)//返利收费,初始化时必须输入返利条件和返利值
         { 
             this.moneyCondition =double.Parse (moneyCondition );
             this.moneyReturn =double.Parse (moneyReturn );
         }
         public override double acceptCash(double money)
         {
             double result=money ;
             if (money >= moneyCondition)//若大于返利条件,则需要减去返利值
                 result = money - Math.Floor(money / moneyCondition) * moneyReturn;

             return result;
         }

     }
    //现金收取工厂
     class CashFactory
     {
         public static CashSuper createCashAccept(string type)
         {
             CashSuper cs = null;
             //根据条件返回相应的对象
             switch (type)
             { 
                 case "正常收费":
                     cs =new CashNormal ();
                     break ;
                 case "满300返100":
                     CashReturn cr1=new CashReturn ("300","100");
                     cs =cr1;
                     break ;
                 case "打8折":
                     CashRebate cr2=new CashRebate ("0.8");
                     cs =cr2;
                     break ;

             }
             return cs;
         }
     }

//客户端窗体程序
        double total = 0.0d;
        private void btnOK_Click(object sender, EventArgs e)
        {
            CashSuper csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());//利用简单工厂模式根据下拉选择框,生成相应的对象
            double totalPrice=0d;
            totalPrice =csuper .acceptCash (Convert .ToDouble (txtPrice.Text))*Convert .ToDouble (txtNum .Text );
            total =total +totalPrice ;
            lbxList.Items .Add ("单价:"+txtPrice .Text +"数量:"+txtNum .Text +""+cbxType.SelectedItem +"合计:"+totalPrice .ToString ());//通过多态可以得到收取费用的结果
            lblResult .Text =total .ToString ();
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            cbxType.Items.Add("正常收费");
            cbxType.Items.Add("满300返100");
            cbxType.Items.Add("打8折");

        }
  通过下面介绍策略模式对比出简单工厂模式的的优缺点!

   

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值