设计模式之策略模式&简单工厂模式

lytwajue lytwajue     2022-09-15     504

关键词:

   学习设计模式已经有非常长一段时间了,事实上先前已经敲过一遍了。可是老认为没有学到什么,认识也不够深刻。如今趁着重构机房,再又一次来过,也不晚。

  事实上在敲了机房之后,看看模式,事实上,曾经非常难理解。非常难看懂的代码一眼就能够看懂了,趁着有点感觉了。早点收获吧。

  简单工厂模式:

  简单地说简单工厂模式:非常easy变化的地方,就能够用到简单工厂模式。

  实例:

  举个样例:我们在逛商场时。正好商场促销,各种优惠活动:有满300返100 ,有打8折的、抽奖等等吧。

  促销来讲,各种优惠活动事实上就是变化。

  再举个样例:我们在买早餐的时候。早餐店里琳琅满目,但不管是谁来这家商店买都系,营业员问你须要什么,他就知道给你拿什么东西。我们须要的东西就是变化。

  浅谈:

  简单工厂模式就是通过传入的数据返回几种可能类宏的一种类的实例。但这几种类通常会有一个共同特点就是:这几种类有一个共同的父类和共同的方法。但每一个方法被容不同。并且依据不同的数据进行优化。

  深入:

  上述是浅谈,实质:面对这些变化,面向对象的思想就是封装这些变化。封装变化之后,则可添加它的可扩展性,不会再改动曾经的类了。

  简单工厂模式结构图:

技术分享

  实现商场促销:

  父类:

<span style="background-color: rgb(204, 204, 204);"><strong>    abstract class CashSuper//父类。一个抽象还是,封装
    {
        public abstract double acceptCash(double money);
    }</strong></span>

  各个子类:

    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);
        }
        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");
                    break;
                case"打8折":
                    CashRebate cr2 = new CashRebate("0.8");
                    break;
            }
            return cs;
        }
    }

 界面层:

        private void button1_Click(object sender, EventArgs e)
        {
            //简单工厂模式-------------------------------------------------------------------
            CashSuper csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString());//简单工厂模式的写法,client认识两个类,CashSuper和CashFactory。再简单工厂模式中就已经实例出了各个子类对象
            double totalPrices = 0d;
            totalPrices = csuper.acceptCash(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
            total = total + totalPrices;
            lbxList.Items.Add("单位价格" + txtPrice.Text + "数量:" + txtNum.Text + "" + cbxType.SelectedItem + "合计:" + totalPrices.ToString());
            label4.Text = total.ToString();

        }

  我们都知道,商店不是一直都有促销的。也不一定今年这这样的促销。明年还是这样的,事物都是在随着时间变化的。假设每次更改打折额度和返利额度,每次都要维护或扩展收费方式,都要修改工厂。一直代码徐又一次编译部署。这要就非常糟糕了,面对算法的市场变动。就须要策略模式了。

  策略模式:

  样例:

  商店里促销每年须要更改打折额度和返利额度。

 结构图:

技术分享

  闲谈:

  事实上策略模式定义了算法家族。分别封装起来。让他们之间能够相互取代,此模式让算法的变化,不会影响到使用算法的客户。全部这些算法完毕的都是同样的工作,仅仅是实现不同,他能够用同样的方法调用全部的算法。降低了算法类和使用算法类之间的耦合。

  深入:

  简单工厂来生成算法对象,算法是随时都可能互相替换,这就是变化点。封装变化点。

  实现商店促销:

  前面的父类和个促销子类不须要改动:

  策略模式代码:

    class CashContext//用一个CashContext来配置,维护一个对Strategy对象的引用。
    {
        CashSuper cs=null;
        public CashContext(string type)//应用了简单工厂模式将父类实例化的对象(不同的子类)
        {
            switch (type)//给一个值,来选择不同的对象。传入详细的策略对象
            {
                case"正常收费":
                    CashNormal cs0=new CashNormal();
                    cs=cs0;
                    break;
                case"满300返100":
                    CashReturn cr1=new CashReturn ("300","100");
                    cs=cr1;
                    break;
                case"打8折":
                    CashRebate cr2=new CashRebate ("0.8");
                    cs=cr2;
                    break;
            }
        }
        public double GetResult(double money)
        {
            return cs.acceptCash(money);
        }
    }

  界面代码:

        private void button1_Click(object sender, EventArgs e)
        {


            //策略模式和简单工厂模式结合----------------------------------------------------
            CashContext csuper = new CashContext(cbxType.SelectedItem.ToString());//client仅仅认识CashContext即可了,纯如详细的策略对象
            double totalprices = 0d;
            totalprices = csuper.GetResult(Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text));
            total = total + totalprices;
            lbxList.Items.Add("单位价格:" + txtPrice.Text + "数量:" + txtNum.Text + " " + cbxType.SelectedItem + "合计:" + totalprices.ToString());
            label4.Text = total.ToString();
        }

  以上就是策略模式和简单工厂模式的结合了,简单工厂模式事实上说简单一点就是:一个类创造实例的过程。策略模式:策略随时有可能互相替换。

  

  











&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

...不错,好好加油。      <<大话设计模式>>解说策略模式是以商场收银软件程序开头的,那么问题来了。哪家商场收银软件强,开玩笑了。读过上篇文章《《简单工厂模式》》的知道,它有两个缺点... 查看详情

简单工厂模式&工厂方法模式&抽象工厂模式的区别(代码片段)

...为简略。这里重新分析分析三者的区别,工厂模式是java设计模式中比较简单的一个设计模式,但很多地方都用到了工厂模式,(如解析xml中,jdbc连接数据库等)利用好工厂模式对程序的设计很有用处。工厂模式在一些设计模式... 查看详情

设计模式实例剖析与深入解读视频教程

...sp;├─简单工厂模式.pptx0c&V"|*?0[#Q,y-@-q│  ├─设计模式与UML之创建型模式(第一讲建造者模式).exe9L8Z$~4V&l;r*B6~+n(B.V│  ├─设计模式与UML之创建型模式(第三讲工厂方法模式).exe│  ├─设计模式... 查看详情

工厂模式&抽象工厂——headfirst设计模式学习笔记

...继承改变创建方法行为。简单工厂:简单工厂并不是一种设计模式,因为只是简单的把创建对象的代码封装起来工厂模式:在父类定义了一个创建对象的接口,通 查看详情

设计模式创建者模式工厂设计模式--工厂设计模式的介绍&简单工厂模式(代码片段)

1.工厂设计模式的介绍和实现需求:设计一个咖啡店点餐系统具体需求:设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设计一个咖啡店类(Coff... 查看详情

设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)

...束之后经过点拨发现在整个项目重构的过程中没有使用到设计模式里的思想,导致整个项目不太符合低耦合高内聚设计原则。所以决定在学习设计模式后,进行一个简单的小项目来练习使用设计模式。本次选择了简单工... 查看详情

设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)

...束之后经过点拨发现在整个项目重构的过程中没有使用到设计模式里的思想,导致整个项目不太符合低耦合高内聚设计原则。所以决定在学习设计模式后,进行一个简单的小项目来练习使用设计模式。本次选择了简单工... 查看详情

一.抽象工厂&工厂方法&简单工厂方法(代码片段)

...3.4工厂方法和抽象工厂的比较1.抽象工厂模式参考《大话设计模式》第十五章1.1问题  用户可能用两种类型的数据库,这两种数据库有类似的方法, 查看详情

一抽象工厂模式&&简单工厂+反射改进抽象工厂

1抽象工厂?  抽象工厂用在既有产品树,又有产品族的场合。    产品树:奔驰旗下的跑车和商务车构成产品树    产品族:奔驰旗下的跑车与奥迪旗下的跑车构成产品族。/*缺点:此时如果需要增加一个红旗厂家的... 查看详情

工厂模式抽象工厂模式策略模式

...做静态工厂方法(StaticFactoryMethod)模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家 查看详情

设计模式之简单工厂模式与策略模式(通过两种模式设计的计算器/java)(代码片段)

...束之后经过点拨发现在整个项目重构的过程中没有使用到设计模式里的思想,导致整个项目不太符合低耦合高内聚设计原则。所以决定在学习设计模式后,进行一个简单的小项目来练习使用设计模式。本次选择了简单工... 查看详情

策略模式+工厂模式-解决ifelse

publicinterfacestrategyextendsInitializingBeanvoidhandler(JsonObjectz2CmdReq);publicclassCtrlInnerPolicyStrategyimplementsstrategy@Overridepublicvoidhandler(JsonObjectz2CmdReq)//TODO@OverridepublicvoidafterPropertiesSet()CmdStrategyFactory.register(CmdTypeConstant.CTRL_INNER_POLICY,this);... 查看详情

设计模式创建者模式(单例&工厂&原型&建造者)(代码片段)

文章目录1.单例设计模式1.1单例模式概述1.2单例模式的实现1.2.1饿汉式(静态变量方式)1.2.2饿汉式(静态代码块方式)1.2.3懒汉式(线程不安全)1.2.4懒汉式(双重检查锁)1.2.5懒汉式(静态内部... 查看详情

策略模式与简单工厂模式(代码片段)

...,工厂模式调用方可以直接调用工厂实例的方法属性等。策略模式是将生成实例的使用策略放在策略类中配置后才提供调用方使用,策略模式不能直接调用实例的方法属性,需要在策略类中封装策略后调用。 事列代码:usingSys... 查看详情

浅谈简单工厂模式和策略模式

...点:子类的实例化被工厂封装了起来,客户端看不到2、策略模式如图代码:publicclassContext{Strategystrategy;publicContext(Strategystrategy){this.strategy=strategy;}publicdoublegetRes 查看详情

编程学习之简单工厂模式与策略模式

很久之前在学习c++的时候就听到老师说写代码要考虑重构,架构,在此期间学习到了一种简单工厂模式。何为简单工厂模式呢?简单工厂模式又叫静态工厂方法模式(StaticFactoryMethodPattern),是通过专门定义一个类来负责创... 查看详情

设计模式之简单工厂模式

简单工厂模式:简单工厂模式(SimpleFactoryPattern):又称为静态工厂方法(StaticFactoryMethod)模式,它属于类创建型模式(同属于创建型模式的还有工厂方法模式,抽象工厂模式,单例模式,建造者模式)。在简单工厂模式中,可以根... 查看详情

简单工厂模式和策略模式的差别

直接上代码:简单工厂模式:------------------------------一个抽象类  --------------------------abstractclassAbsClass{   //抽象方法:提供一些列的算法操作   publicabstract voidacceptCash(stri 查看详情