zoukankan      html  css  js  c++  java
  • 策略模式VS简单工厂模式

    简单工厂模式

    定义:由一个工厂类决定创建出哪一种类的实例。以大话设计模式中的运算器的设计为例。我们可以抽象出OperationFactory类来实例化具体的运算类。
    具体代码如下:
        public class OperationFactory{
            public static Operation createOperate(String operate){
                Operation oper = null;
                switch(opterate){
                    case "+":
                        oper = new AddOperation();
                        break;
                    case "-":
                        oper = new SubOperation();
                        break;
                    case "*":
                        oper = new MulOperation();
                        break;
                    case "/":
                        oper = new DivOperation();
                        break;
                }
                return oper;
            }
        }
    可得类图如下:

    策略模式

    定义:定义了算法家族分别封装起来,让他们之间可以互相转换,此模式让算法的变化,不会影响到使用算法的用户。
    同样,以大话设计模式中的促销系统为例,讲解策略模式。假设超市需要一个促销系统,可以提供如满减,打折等形式的促销计价。
    运用策略模式,我们可以设计类CashContext:
    public class CashContext{
        private CashSuper cs:
        
        public CashContext(CashSuper csuper){
            this.cs = cspuer;
        }
        
        public double GetResult(double money){
            return cs.acceptCash(money);
        }
    }
    这样,我们在定义一个CashSuper抽象类来标明促销类型,然后各实现类来负责各类型的计算。具体类图如下:

    策略与简单工厂的结合

    按照策略模式的设计,我们的客户端的设计需要指定具体的实现子类
    然后才能调用CashContext的GetResult方法。
    这样,在客户端的设计中我们需要将先生成实现子类,然后调用策略模式进行成交价格的计算。系统耦合加大。
    我们可以结合策略模式和工厂模式,将找到实现类的方式通过工厂进行封装,然后在工厂内实现策略模式进行实现类的运算。
    改造后的CashContext:
    public class CashContext{
        private CashSuper cs:
        
        public CashContext(String type){
            switch(type){
                    case "正常收费":
                        cs  = new CashNormal();
                        break;
                    case "满300-100":
                        cs = new CashReturn(300, 100);
                        break;
                    case "打8折":
                        cs = new CashRebate(0.8);
                        break;
                }
        }
        
        public double GetResult(double money){
            return cs.acceptCash(money);
        }
    }

    总结

    简单工厂模式的优点:
    利用继承与多态,由一个工厂实例化类,而不需要调用方自己去实例化类。有助于类的解耦。
    策略模式的优点:
    1、封装了算法。
    2、算法实现类的父类总结出类算法的公共功能。
    3、每个算法单独实现,相互之间没有耦合。
    策略模式的缺点:
    调用方对算法实现类的选择需要自己做衡量。
    策略模式和工厂模式结合的优点:
    将实现类的选择交给了策略工厂类,使调用方的代码更干净。
    策略模式和工厂模式结合的缺点:
    虽然在调用方的代码中去掉了分支判断,但是如果需要增加实现类,还是需要修改策略工厂类的。
  • 相关阅读:
    推荐系统中的策略与算法互补
    思考:数据结构与算法:
    思考:代码中什么是关联?什么情形才会关联?怎么实现关联?
    思考:高并发(通用的成熟的)解决思想
    思考:学习一个知识后如何对自己进行测试?如何出题呢?
    不要小看用的好用的熟,因为这需要更好的理解和应用
    打了好久五笔,速度提不起来怎么办?
    学习 APPIUM 元素定位 (JAVA)-xpath
    appium 元素定位方法
    uiautomatorviewer 定位提示Error obtaining UI hierarchy
  • 原文地址:https://www.cnblogs.com/Ugly-bear/p/10611156.html
Copyright © 2011-2022 走看看