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

server/2024/11/15 1:55:58/

引言

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

工厂模式

 定义

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

优点

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

缺点

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

使用场景

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

示例代码

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"

区别

用途

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

关注点

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

使用方式

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

应用场景

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

总结

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


http://www.ppmy.cn/server/100105.html

相关文章

Redis常用的命令、Redis-String类型常用的命令

1、数据结构的介绍: StringHashListSetSortedSetGEOBitMapHyperLog 2、Redis通用的命令 : 通用执行是部分数据类型的,都可以使用的指令,常见的有: KEYS:查看复合模版的所有key,不建议在生产…

vulnstack-5

环境搭建 靶场虚拟机共用两个,一个外网一个内网,用来练习红队相关内容和方向,主要包括常规信息收集、Web攻防、代码审计、漏洞利用、内网渗透以及域渗透等相关内容学习。 虚拟机密码 win7 sun\heart 123.com sun\Administrator dc123.com # …

分类预测|基于灰狼优化最小二乘支持向量机结合Adaboost集成的数据分类预测Matlab程序GWO-LSSVM-Adaboost

分类预测|基于灰狼优化最小二乘支持向量机结合Adaboost集成的数据分类预测Matlab程序GWO-LSSVM-Adaboost 文章目录 前言分类预测|基于灰狼优化最小二乘支持向量机结合Adaboost集成的数据分类预测Matlab程序GWO-LSSVM-Adaboost 一、GWO-LSSVM-Adaboost模型1. Grey Wolf Optimize…

【智能流体力学】ANSYS Fluent流体仿真基础深度学习驱动的前期准备:CAX计算机辅助集成技术

目录 一、CAX计算机辅助集成技术二、计算机辅助工程(CAE)三、SCDM (Species Concentration Display Model) 显示和分析物质浓度分布的模型1. **SCDM概述**2. **主要功能**3. **功能特点**4. **使用步骤**5. **应用实例**6. **优点与限制**四、行业应用五、Fluent 软件功能1. …

先进制造aps专题二十四 云平台排产aps的方案设计

云平台排产aps的方案设计 针对对象是有排产需求无需定制的中小型工厂企业 一 网站功能(b/s架构) 1 前端界面 客户登录 排产项目管理 基础数据(产品资料,产品工艺,工作日历,生产资源,工艺能力…

推荐一个根据后台提供的接口json文件自动生成前端调用接口的插件typescript

openapi-typescript-codegen 会为每个接口生成调用的方法,一般都是用一个接口手动添加一个接口方法在前端代码里,用了这个插件页面直接导入它生成的方法进行使用,里面也包含请求拦截器和响应拦截器的封装,可以不用手动封装这部分…

从MySQL到Elasticsearch:创建酒店索引案例

在现代的数据管理中,Elasticsearch(简称ES)因其强大的搜索功能和灵活的索引结构而受到广泛欢迎。本篇博客将介绍如何根据MySQL数据库中的酒店表定义,创建一个相应的Elasticsearch索引。 MySQL与Elasticsearch的对比 在开始之前&…

Qt | QGraphicsView+QGraphicsScene+QGraphicsItem会跳舞的机器人

点击上方"蓝字"关注我们 01、GraphicsView GraphicsView 是 Qt 框架中的一个重要组件,用于显示和交互 2D 图形项(QGraphicsItem)。它提供了一个高级的、可缩放的视图,适用于需要复杂图形交互的应用程序,如图形编辑器、地图查看器等。 以下是一些关于 Graphics…