个人理解简单工厂模式和策略模式的区别

       刚刚接触设计模式的时候,我相信单例模式和工厂模式应该是用的最多的,毕竟很多的底层代码几乎都用了这些模式。自从接触了一次阿里的公众号发的一次文章关于 DDD的使用 以后,就逐渐接触了策略模式。现在在项目中运用最多的也是这几种设计模式了,用了设计模式给我的感受就是感觉代码没那么冗余了,再注入一点贫血,充血模型之后,感觉在 service 层面代码看上去很舒服很简洁。

       首先,我个人感觉策略模式和我们常说的微服务我觉得思想上很像,尤其记得当时介绍DDD时候的举例说的是关于银行的转账案例,用的事务和领域驱动设计做的比较,让人一目了然的逻辑,代码也再也没有那么冗余了。(具体的文章地址找不到了,不过网上现在比较多的介绍DDD的,大体意思是一样的

     其实工厂模式和设计模式一直给人一种错觉,总感觉是一样的,没有丝毫的区别。可以看下两种模式的UML图

   从图上来看,并没有多大的区别,话不多说,从具体的代码入手。

   先写一个人的接口类,有eat,run,wear 3个方法

public interface People {

    public void eat();

    public void run();

    public void wear();
}

     分别写两个实现类,一个是小明的实现类,一个是小红的实现类

  

public class Xiaoming implements People{

    @Override
    public void eat() {
        System.out.println("小明吃饭");
    }

    @Override
    public void run() {
        System.out.println("小明跑步");
    }

    @Override
    public void wear() {
        System.out.println("小明穿衣");
    }
}


public class Xiaohong implements People{

    @Override
    public void eat() {
        System.out.println("小红吃饭");
    }

    @Override
    public void run() {
        System.out.println("小红跑步");
    }

    @Override
    public void wear() {
        System.out.println("小红穿衣");
    }
}

     简单工厂模式的代码

    

public class PeopleFactory {

    public People getPeople(String name){
        if(name.equals("Xiaoming")){
            return new Xiaoming();
        }else if(name.equals("Xiaohong")){
            return new Xiaohong();
        }
        return null;
    }
}

  再来看下策略模式的代码

   

public class StrategySign {

    private People people;

    public StrategySign(People people){
        this.people = people;
    }

    public StrategySign(String name){
        if(name.equals("Xiaoming")){
            this.people = new Xiaoming();
        }else if(name.equals("Xiaohong")){
            this.people = new Xiaohong();
        }
    }

    public void run(){
        people.run();
    }
}

  策略模式的两种构造方法都可以用,我多写了一种是为了让大家看到和工厂模式的区别和联系

  然后我们通过测试类运行两种模式

@Test
    public void testSign(){
        PeopleFactory peopleFactory = new PeopleFactory();
        People people = peopleFactory.getPeople("Xiaohong");
        System.out.print("工厂模式-------------"); people.run();
        StrategySign strategySign = new StrategySign("Xiaohong");
        System.out.print("策略模式-------------");strategySign.run();
    }

      

    可以看到,两种设计模式的运行结果是一模一样的,那么区别到底在哪呢。

   从工厂模式的代码中可以看到 工厂模式主要是返回的接口实现类的实例化对象,最后返回的结果是接口实现类中的方法,而策略模式是在实例化策略模式的时候已经创建好了,我们可以再策略模式中随意的拼接重写方法,而工厂模式是不管方法的拼接这些的,他只关注最后的结果,不注重过程,而策略模式注重的是过程。

   用一个具体的例子可以看下,如果我想小红先吃饭再跑步再吃饭的话,那么我需要在测试类中写3种,而我只需要在策略模式的方法中直接定义即可。

   可以看以下代码:

public class StrategySign {

    private People people;

    public StrategySign(People people){
        this.people = people;
    }

    public StrategySign(String name){
        if(name.equals("Xiaoming")){
            this.people = new Xiaoming();
        }else if(name.equals("Xiaohong")){
            this.people = new Xiaohong();
        }
    }

    public void run() {
        people.eat();
        people.run();
        people.eat();
    }
}

@Test
    public void testSign(){
        PeopleFactory peopleFactory = new PeopleFactory();
        People people = peopleFactory.getPeople("Xiaohong");
        System.out.print("工厂模式-------------"); people.eat();
        System.out.print("工厂模式-------------"); people.run();
        System.out.print("工厂模式-------------"); people.eat();
        StrategySign strategySign = new StrategySign("Xiaohong");
        System.out.print("策略模式-------------");strategySign.run();
    }

  有人可能会说如果我在实现类中直接拼接好这些方法不是就好了么?可是那样的话我们每变更一次逻辑就要新增一个方法,一次两次还好,但是当逻辑多了以后,这些代码会变得很冗余,难以维护。而且从目前情况来看,工厂模式可以做到的事情,策略模式都可以做到。策略模式可以做到的事情,工厂模式也可以做到,只是会变得麻烦。

     从上述的描述来看,策略模式就和我们常说的微服务很像,比如我们写的3个接口,吃饭是一个微服务,跑步是一个微服务,穿衣是一个微服务。策略模式的宗旨就是将各项方法之间连接起来,达到一个新的方法,微服务的宗旨也是防止服务的多次调用,降低代码的耦合度,因此这么看来策略模式和微服务还是比较相像的。

 

如果错误之处欢迎指出。

  • 81
    点赞
  • 169
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
创建型模式、结构型模式和行为型模式是软件设计模式的三个主要分类,它们分别关注不同的问题和解决方案。下面是它们的区别理解: 1. 创建型模式 创建型模式关注对象的创建和组合方式,主要解决对象的创建问题。其中常见的模式包括工厂方法模式、抽象工厂模式、单例模式、建造者模式和原型模式。 - 工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。将对象的创建和使用解耦。 - 抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。通过工厂族类来实现。 - 单例模式:保证一个类只有一个实例,并提供一个全局访问点。 - 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 - 原型模式:通过复制一个原型对象来创建新的对象,避免了类的构造函数和复杂的对象初始化过程。 2. 结构型模式 结构型模式关注对象之间的组合方式,主要解决对象的组合问题。其中常见的模式包括适配器模式、桥接模式、组合模式、装饰模式、外观模式、享元模式和代理模式。 - 适配器模式:将一个类的接口转换成客户希望的另一个接口,使得原本由于接口不兼容而不能在一起工作的类可以在一起工作。 - 桥接模式:将抽象和实现解耦,使它们可以独立变化。 - 组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户端可以统一地处理单个对象和组合对象。 - 装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 - 外观模式:为子系统中的一组接口提供一个一致的界面,使得子系统更加容易使用。 - 享元模式:运用共享技术有效地支持大量细粒度的对象。通过共享相同状态的对象,减少对象的数量,达到节省内存的目的。 - 代理模式:为其他对象提供一种代理以控制对这个对象的访问。 3. 行为型模式 行为型模式关注对象之间的通信方式,主要解决对象的通信问题。其中常见的模式包括责任链模式、命令模式、解释器模式、迭代器模式、中介者模式、备忘录模式、观察者模式、状态模式、策略模式和模板方法模式。 - 责任链模式:将请求的发送者和接收者解耦,通过链式处理请求。 - 命令模式:将请求封装为一个对象,使得可以用不同的请求对客户进行参数化。 - 解释器模式:给定一个语言,定义它的文法的一种表示,并定义一个解释器,用来解释语言中的句子。 - 迭代器模式:提供一种方法顺序访问一个聚合对象中的各个元素,而不暴露该对象的内部表示。 - 中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 - 备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便之后可以将该对象恢复到原先保存的状态。 - 观察者模式:定义了对象之间的一种一对多的依赖关系,当一个对象状态发生改变时,所有依赖它的对象都得到通知并自动更新。 - 状态模式:允许一个对象在其内部状态改变时改变其行为,看起来像是改变了对象的类。 - 策略模式:定义了一系列的算法,将每一个算法封装起来,并使它们可以互换。 - 模板方法模式:定义了一个算法的骨架,将一些步骤的实现延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法的某些特定步骤。 以上是创建型模式、结构型模式和行为型模式的区别理解,希望对你有所帮助。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值