工厂模式与策略模式的区别及使用场景

引言

工厂模式和策略模式都是设计模式中的经典案例,它们分别属于创建型模式和行为型模式。工厂模式主要用于对象的创建,而策略模式则用于封装算法。本文将深入探讨这两种模式的特点,并给出实际应用的例子。

工厂模式

定义

工厂模式是一种创建型设计模式,它提供了一个创建对象的接口,但允许子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。

优点

  • 封装了对象创建的逻辑,提高了系统的灵活性。
  • 遵循开闭原则,即对扩展开放,对修改关闭。

缺点

  • 当产品等级结构发生变化时,需要修改工厂类。

使用场景

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 一个类通过其子类来指定创建哪个对象。

示例代码

java 复制代码
class Animal {
  makeSound() {}
}

class Dog extends Animal {
  makeSound() {
    console.log('Woof!');
  }
}

class Cat extends Animal {
  makeSound() {
    console.log('Meow!');
  }
}

class AnimalFactory {
  static createAnimal(type) {
    if (type === 'dog') {
      return new Dog();
    } else if (type === 'cat') {
      return new Cat();
    }
  }
}

const dog = AnimalFactory.createAnimal('dog');
dog.makeSound(); // 输出 "Woof!"

策略模式

定义

策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法独立于使用它的客户而变化。

优点

  • 符合开闭原则。
  • 客户端可以选择不同的策略。
  • 策略模式提供了很好的扩展性。

缺点

  • 策略模式会增加更多的类。
  • 如果策略模式被过度使用,可能会导致系统难以理解和控制。

使用场景

  • 多个类只有在算法或行为上稍有不同的场景。
  • 算法需要自由切换。

示例代码

java 复制代码
class Strategy {
  execute(data) {}
}

class ConcreteStrategyA extends Strategy {
  execute(data) {
    console.log(`Processing data using Strategy A: ${data}`);
  }
}

class ConcreteStrategyB extends Strategy {
  execute(data) {
    console.log(`Processing data using Strategy B: ${data}`);
  }
}

class Context {
  constructor(strategy) {
    this.strategy = strategy;
  }

  setStrategy(strategy) {
    this.strategy = strategy;
  }

  doSomeBusinessLogic(data) {
    this.strategy.execute(data);
  }
}

const context = new Context(new ConcreteStrategyA());
context.doSomeBusinessLogic('Sample Data'); // 输出 "Processing data using Strategy A: Sample Data"
context.setStrategy(new ConcreteStrategyB());
context.doSomeBusinessLogic('Sample Data'); // 输出 "Processing data using Strategy B: Sample Data"

区别

用途

  • 工厂模式 主要用于对象的创建,它让一个类的实例化延迟到其子类。
  • 策略模式 主要用于让一个对象在许多行为中选择一种行为,适应行为的变化。

关注点

  • 工厂模式 关注对象的创建。
  • 策略模式 关注行为的封装。

使用方式

  • 工厂模式 中,实例化对象后调用具体方法。
  • 策略模式 中,需要先制定实例化的具体类,再调用抽象的方法。

应用场景

  • 当产品比较具体、有限且没有多个算法重叠时,适合使用 简单工厂模式
  • 当产品构造有多次重叠,且有在不同时刻应用不同的规则时,适合使用 策略模式

总结

工厂模式和策略模式都是设计模式的重要组成部分,它们各自解决了不同的问题。工厂模式着重于对象的创建过程,而策略模式则更侧重于算法的选择和执行。在实际开发中,根据需求选择合适的设计模式能够提高代码的可维护性和扩展性。

相关推荐
吃喝不愁霸王餐APP开发者2 分钟前
基于Spring Cloud Gateway实现对外卖API请求的统一鉴权与流量染色
java·开发语言
a努力。5 分钟前
美团Java面试被问:Redis集群模式的工作原理
java·redis·后端·面试
一雨方知深秋14 分钟前
面向对象编程
java·封装·this·构造器·static关键字·成员变量·javabean实体类
资生算法程序员_畅想家_剑魔17 分钟前
Java常见技术分享-11-责任链模式
java·spring boot·责任链模式
计算机程序设计小李同学1 小时前
动漫之家系统设计与实现
java·spring boot·后端·web安全
程序员阿鹏1 小时前
责任链模式
java·spring·servlet·tomcat·maven·责任链模式
@淡 定1 小时前
Java内存模型(JMM)详解
java·开发语言
czhc11400756632 小时前
C# 1221
java·servlet·c#
黄俊懿2 小时前
【深入理解SpringCloud微服务】Seata(AT模式)源码解析——全局事务的回滚
java·后端·spring·spring cloud·微服务·架构·架构师
派大鑫wink2 小时前
【Day12】String 类详解:不可变性、常用方法与字符串拼接优化
java·开发语言