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、每个算法单独实现,相互之间没有耦合。
    策略模式的缺点:
    调用方对算法实现类的选择需要自己做衡量。
    策略模式和工厂模式结合的优点:
    将实现类的选择交给了策略工厂类,使调用方的代码更干净。
    策略模式和工厂模式结合的缺点:
    虽然在调用方的代码中去掉了分支判断,但是如果需要增加实现类,还是需要修改策略工厂类的。
  • 相关阅读:
    118/119. Pascal's Triangle/II
    160. Intersection of Two Linked Lists
    168. Excel Sheet Column Title
    167. Two Sum II
    172. Factorial Trailing Zeroes
    169. Majority Element
    189. Rotate Array
    202. Happy Number
    204. Count Primes
    MVC之Model元数据
  • 原文地址:https://www.cnblogs.com/Ugly-bear/p/10611156.html
Copyright © 2011-2022 走看看