精华内容
下载资源
问答
  • 策略模式和工厂模式
    2022-07-14 00:06:26

    工厂模式

    提供一个创建产品的接口(工厂接口),由该接口的实现类去决定如何去创建产品。

    根据实际场景选择不同的工厂实现类去创建所需要的产品,不关注该产品的创建细节,只要把该产品创建出来就行。

    策略模式

    提供一系列的策略,这些策略是可替代的,可以灵活使用策略,执行不同的行为。

    在知道所有的策略的情况下,选择当前最适合的策略去执行。

    区别

    • 用途不一样
      工厂是创建型模式,它的作用就是创建对象;
      策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;
    • 关注点不一样
      一个关注对象创建
      一个关注行为的封装

    • 解决不同的问题
      工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。
      策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

    更多相关内容
  • 策略模式和工厂模式很像。 工厂模式:着眼于得到对象,并操作对象。 策略模式:着重得到对象某方法的运行结果。 示例: //实现一个简单的计算器 interface MathOp{ public function calculation($num1,$num2); } /...
  • 工厂模式和策略模式看着很像,经常让人混淆不清;它们的区别在哪里,需要细细体味;相似点在模式结构上,两者很相似;差异用途不一样工厂是创建型模式,它的作用就是创建对象;策略是行为型模式,它的作用是让一个对象...

    工厂模式和策略模式看着很像,经常让人混淆不清;

    它们的区别在哪里,需要细细体味;

    相似点

    在模式结构上,两者很相似;

    差异

    用途不一样

    工厂是创建型模式,它的作用就是创建对象;

    策略是行为型模式,它的作用是让一个对象在许多行为中选择一种行为;

    关注点不一样

    一个关注对象创建

    一个关注行为的封装

    解决不同的问题

    工厂模式是创建型的设计模式,它接受指令,创建出符合要求的实例;它主要解决的是资源的统一分发,将对象的创建完全独立出来,让对象的创建和具体的使用客户无关。主要应用在多数据库选择,类库文件加载等。

    策略模式是为了解决的是策略的切换与扩展,更简洁的说是定义策略族,分别封装起来,让他们之间可以相互替换,策略模式让策略的变化独立于使用策略的客户。

    工厂相当于黑盒子,策略相当于白盒子;

    举例说明

    工厂模式

    有一天你决定去吃培根披萨,首先得选择店铺,A店和B店都有培根披萨;

    你点了A店的培根披萨,过了二十分钟,你的披萨就来了就可以吃到了。但这个披萨是怎么做的,到底面粉放了多少,培根放了多少,佐料放了多少,有多少道工序,你是不需要管的,你需要的是一个美味培根披萨。

    策略模式

    在披萨店,你要一个培根披萨,老板说有标准的pizza,也可以自己去做。原料有培根、面粉、佐料。工序有1、2、3工序,你自己去做吧。然后你就需要自己去做,到底放多少培根,放多少面粉,放多少佐料,这都你自己来决定,工序1、2、3,你是怎么实现的,都你自己决定。最后你得到了披萨。

    代码实现

    我们用代码来实现上面的不同点:

    工厂模式

    64ce961724f25b9919553dccb7335bfb.png

    class Store

    {

    void orderPizza(){

    Pizza *p = createPizza()

    //有了pizza对象后,接下来的工序都是一样的,对用户而言,是透明的;

    p->prepare(); //准备材料,放调料

    p->bak(); //烘烤

    p->cut(); //切块

    }

    virtual createPizza() = 0;

    }

    class AStore : public Store

    {

    virtual Pizza * createPizza()

    {

    Pizza * p = new APizza();

    return p;

    }

    }

    策略模式

    3b40255efdff59144c43909c357e1e72.png

    class Store

    {

    void orderPizza(){

    Pizza *p = MyPizza();

    //工序都有,但是具体如何实现,由用户来确定实现;

    p->prepare();

    p->bak();

    p->cut();

    }

    class MyPizza : public Pizza

    {

    virtual void prepare(){

    //我的pizza我做主,我可以多放点肉,再多来点酱

    }

    virtual void bak(){

    //我想烤的时间长点,这样会更脆

    }

    virtual void cut(){

    //切块,我想切成20块,像吃西瓜片那样吃披萨

    }

    }

    Posted by: 大CC | 24JUN,2014

    博客:blog.me115.com [订阅]

    微博:新浪微博

    展开全文
  • 工厂模式和策略模式

    2021-12-01 14:28:53
    文章目录工厂模式什么是工厂模式工厂模式的例子策略模式什么是策略模式策略模式的使用策略模式与工厂模式共用的例子 工厂模式 什么是工厂模式 定义一个接口(工厂的抽象接口),让其子类实现具体的功能(工厂类) ...

    工厂模式


    什么是工厂模式

    定义一个接口(工厂的抽象接口),让其子类实现具体的功能(工厂类)

    根据开闭原则,对扩展开放,对修改封闭。已经定义好的工厂类,不会进行功能的修改(这里指的不是修改功能bug,而是不可在原有功能基础上新增功能或改为另一个功能),只可以新建一个工厂类(新建一个子类实现工厂的抽象接口),去做新的功能

    工厂模式的例子

    举个例子:
    我完成的支付功能,它有如下的需求:对外提供一个pay(以及refund等)方法,根据不同的渠道(app,h5,小程序等),以及不同的支付方式,完成支付(或退款功能)。

    • 建立IPayFactory工厂
    public interface IPayFactory{
       // 支付 
       Result pay(PayCmd payCmd);
       // 退款
       Result refund(RefundCmd refundCmd);
       // 支付查询
       Result payQry(String payOrderNo);
       // 退款查询
       Result refundQry(String refundOrderNo);
    }
    
    • 建立工厂类(支付宝App工厂)
        // 注册为组件
        @Component
        public class AliAppFactory implements IPayFactory{
           // 支付 
           @Override
           Result pay(PayCmd payCmd){
              ... 支付宝App支付功能
              return 预下单参数;
           }
           // 退款
           @Override
           Result refund(RefundCmd refundCmd){
              ... 支付宝App退款功能
              return 退款结果;
           }
           // 支付查询
           @Override
           Result payQry(String payOrderNo){
               return null;
           }
           // 退款查询
           @Override
           Result refundQry(String refundOrderNo){
               return null;
           }
        }
    

    以上就是工厂模式的案例,可见,这样的做法有很大的扩展性,新的工厂不会影响到已有工厂的逻辑,各司其职。

    当然,工厂模式也有其缺点。如果未来的工厂类特别多,管理起来就会非常麻烦。比如我支付方式有微信支付、支付宝支付、度小满支付、华为支付等,支付的渠道有App,微信小程序,支付宝小程序,H5,公众号,渠道商等,就会衍生出非常多的支付组合,管理起来会非常麻烦。

    策略模式

    什么是策略模式

    可以用军队指挥官来举例。要打一场仗,结果必定是执行打仗这个操作,但是要怎么打,需要分兵作战、各个击破,还是要集中兵力、逐个击破,抑或是虚实相交、迷惑敌人…这些都取决于指挥官所使用的策略。

    可见,策略模式是一种倾向于行为的一种模式,需要预先定义要执行的方案,根据客户端传来的参数,来实行不同的方案。

    策略模式的使用

    由于策略模式需要寻求每个策略间的共性,因此经常会和工厂模式、模版方法模式共用。如工厂模式,由工厂决定行为/共性,由策略模式决定要使用哪个工厂(方案/策略)。

    策略模式与工厂模式共用的例子

    接上面工厂模式,我们再定义一个策略类及策略枚举。

     // 策略类IPayStrategy
        public class IPayStrategy{
            public IPayFactory buildFactory(String arg){
                Class clazz = PayFactoryEnum.getFactory(arg);
                // 获取spring中的Bean,即工厂类的实例
                IPayFactory factory = SpringUtil.getBean(clazz)return factory;
            }
        }
    
    // 策略枚举
        public enum PayFactoryEnum{
            ALI_APP_PAY("arg1", AliAppFactory.class),
            ...;
        
            public static Class getFactory(String arg){
               ......
               return xxx.class;
            }
        }
    

    如果我们想支付的时候,调用

    IPayStrategy.buildFactory(arg).pay(payCmd)

    即可。当需要扩展新的支付方式时,新建一个工厂类,在策略枚举中新加一个策略PayFactoryEnum即可。

    展开全文
  • 工厂模式和策略模式的区别。 正文 策略模式的实现代码: 1、新建接口 public interface RecordHandler { void saveLocal(Object resource); void removeLocal(); HandleType getType(); } 复制代码 2、...

    前言

    工厂模式和策略模式的区别。

    正文

    策略模式的实现代码:

    1、新建接口

    public interface RecordHandler {
    
        void saveLocal(Object resource);
    
        void removeLocal();
    
        HandleType getType();
    
    }
    复制代码

    2、编写接口的实现类:

    public class Demo2 implements RecordHandler{
    
        @Override
        public void saveLocal(Object resource) {
            System.out.println("把Demo2的数据保存到DB");
        }
    
        @Override
        public void removeLocal() {
            System.out.println("移除Demo2的数据");
        }
    
        @Override
        public HandleType getType() {
            return HandleType.DEMO2;
        }
    
    }
    复制代码
    public class Demo1 implements RecordHandler{
    
        @Override
        public void saveLocal(Object resource) {
            System.out.println("把Demo1的数据保存到DB");
        }
    
        @Override
        public void removeLocal() {
            System.out.println("移除Demo1的数据");
        }
    
        @Override
        public HandleType getType() {
            return HandleType.DEMO1;
        }
    }
    复制代码

    3、新建策略或者Manager类

    public class RecordHandleManager {
    
        //定义策略的工厂类
        public Map<String, RecordHandler> maps = new HashMap<>();
    
    
        public void setMaps(List<RecordHandler> recordHandlerList ){
            if (recordHandlerList == null || recordHandlerList.size() <= 0 ){
                System.out.println("failed recordHandle");
            }
            recordHandlerList.stream().forEach(P ->
    
                    maps.put(P.getType().getType(),P));
    
        }
    
    
        public void saveLocal(HandleType type,Object obj){
            RecordHandler recordHandler = maps.get(type.getType());
            recordHandler.saveLocal(obj);
        }
    
        public void removeLocal(HandleType type){
            RecordHandler recordHandler = maps.get(type.getType());
            recordHandler.removeLocal();
        }
    
    }
    复制代码

    4、调用

    RecordHandleManager recordHandlerManager = new RecordHandleManager();
    recordHandlerManager.setMaps(Arrays.asList(new Demo(),new Demo1(),new Demo2()));
    recordHandlerManager.saveLocal(HandleType.DEMO2,new Object());
    复制代码

    工厂模式的实现 1、新建接口类

    public interface FactoryPhone {
    
    
        void makeCar();
    }
    复制代码

    2、新建接口的实现类

    public class Aodi implements FactoryPhone{
    
        @Override
        public void makeCar() {
            System.out.println("生产奥迪汽车");
        }
    }
    ```
    public class TModel implements FactoryPhone{
    
    
        @Override
        public void makeCar() {
            System.out.println("生产Tmodel汽车");
        }
    }
    ```
    复制代码

    3、新建Manager

    public class CarManager {
    
        public FactoryPhone reject(String name){
            if ("奥迪".equalsIgnoreCase(name)){
                return new Aodi();
            }else{
                return new TModel();
            }
        }
    
    }
    复制代码

    4、调用

      public static void main(String[] args) {
    //
    //        RecordHandleManager recordHandlerManager = new RecordHandleManager();
    //        recordHandlerManager.setMaps(Arrays.asList(new Demo(),new Demo1(),new Demo2()));
    //        recordHandlerManager.saveLocal(HandleType.DEMO2,new Object());
    
    
            CarManager carManager = new CarManager();
            FactoryPhone factoryPhone = carManager.reject("奥迪");
            factoryPhone.makeCar();
        }
    复制代码

    可以明显的看到。调用的时候,返回的是接口的实现类,而策略模式是通过Manager类进行调用的。


     

    展开全文
  • 在现实开发中,遇到中途改需求,加功能的事情屡见不鲜.但面对已完成的程序代码,却是需要几乎重头来过的尴尬,这实在是痛苦不堪。说白了,原因就是因为我们原先所写的程序,不...这就需要使用设计模式使得程序更加的灵活,
  • 策略+工厂方法模式的实现思想
  • java策略模式+工厂模式+模板模式

    千次阅读 2022-02-12 18:08:42
    java策略模式+工厂模式+模板模式
  • 前面的文章简单的实现了策略模式。今天进阶一下。 依旧用打折的案例。普通用户八折,会员五折。 话不多说,直接上代码 1.来一个用户类的枚举 public enum UserTypeEnum { USER,MEMBER; } 2.接着来一个注解类 @...
  • 策略模式+工厂模式的组合使用

    千次阅读 2021-12-22 14:04:39
    策略模式+工厂模式的组合使用 **策略模式:**定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 个人感觉特别好用,当你在一段代码中,有很多的候选算法,你就可以用这个策略模式了,可以有效的取出if...
  • 策略模式例子代码,对不同类型的对象执行同一函数,会使用该类型自有的算法,无需指定
  • 策略模式工厂模式结合.rar,策略模式二,.vs,策略模式二,v15,Browse.VC.db,.suo,ipch,AutoPCH,8dcdb6bf44a66d81,MAIN.ipch,7c99f5e6967469a5,ADDOPERATION.ipch,79d7649afcb163a4,COPERATION.ipch,edddfadaaf2ae5b6,...
  • 工厂(Factory)模式我们可以做如下理解,假设有一个Audi的公司生产汽车(似乎也不用假设了),它掌握一项核心的技术就是生产汽车,另一方面,它生产的汽车是有不同型号的,...而策略模式的客户端传达给服务端的是一个
  • 策略模式和工厂模式在促销系统下的应用 设计模式为我们提供了在某些应用场景下特定问题的解决方案,今天我们利用策略模式和工厂模式实现一个简单的促销系统。 实现语言:PHP 我们先来回顾一下策略模式和工厂...
  • 策略模式工厂模式的结合使用

    千次阅读 2019-11-28 14:55:22
    策略模式: 定义了一组算法(业务规则); 封装了每个算法; 这族的算法可互换代替(interchangeable)。 组成: 抽象策略角色: 策略类,通常由一个接口或者抽象类实现。 具体策略角色:包装了相关的算法...
  • 对于代码写到一定地步,肯定会遇到很多业务代码的繁琐的if else分支。简单的几个条件可以if else几个,但是一旦后面的条件越来越多...根据工厂的抽象程度可分为工厂方法模式和抽象工厂模式。用于封装和管理对象的创建,
  • 简单工厂模式和策略模式的比较

    万次阅读 多人点赞 2018-06-30 20:51:01
    再看一下策略模式: 看完他们的结构图,是不是有种很相似的感觉?唯一不同的就是 简单工厂 Context类。接下来再看一下代码上有什么区别。 简单工厂Context类中代码的区别 简单工厂类: public ...
  • Java设计模式中的策略模式(Strategy Patten)定义了一组算法,将每个算法都封装起来,并且可使它们之间可以相互替换,在客户端调用它们时可以互不影响。策略模式主要由三个角色组成1、抽象策略角色:通常是一个接口或...
  • 策略模式:客户端创建一个Context类对象a(可以看作是工厂模式中工厂类),创建一个策略对象并传参给对象a,然后客户端使用a对象的某些方法来使用前面传参进来的策略,即客户端是通过a对象使用策略的。简单的说,1、...
  • 工厂模式和策略模式的综合使用

    千次阅读 2020-06-24 14:34:37
    一、简单的工厂模式了解与使用 二、简单的策略模式了解与使用 三、工厂模式和策略模式的综合使用
  • 深入浅出设计模式之抽象工厂模式+工厂方法模式+策略模式实现手机加工厂
  • 策略模式+工厂模式结合使用

    千次阅读 2020-05-12 09:49:04
    策略模式工厂模式结合使用 定义 策略模式:定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的改变不会影响使用算法的客户。 工厂模式:定义一个用于创建产品的接口,由子类决定生产什么产品...
  • 简单工厂模式和策略模式的区别

    千次阅读 2018-07-17 12:10:21
    简单工厂模式和策略模式在结构模式上两者很相似,所以我们经常会混淆它们。这里就先说一说我对它们的理解。  简单工厂模式::客户端传一个条件进工厂类,工厂类根据条件生成相应的对象并返回给客户端。  策略...
  • 当我们实现某个接口时,可能会有很多种不同的实现方式,这些不同的实现类通过一定的规则可以随意切换使用时,我们就可以考虑使用策略模式来实现。 一、定义 Define a family of algorithms,encapsulate each one, ...
  • 一、策略模式 策略模式定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换 1、策略模式主要角色 主要角色如下: 封装角色(Context):也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略、...
  • java策略模式和工厂模式的区别

    千次阅读 2016-11-03 15:12:14
    这两天初学设计模式的时候发现工厂模式和策略模式写法上相似,感觉很疑惑。既然相似,为何还要专门写成两种不同的模式呢。在翻阅了各个高手的总结后,偶有一点启发,特此记下。 有一个高手说 工厂相当于黑盒子,...
  • 什么是策略模式 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。...在下面的代码中,分别用策略模式和策略工厂模式实

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 239,849
精华内容 95,939
关键字:

策略模式和工厂模式