简单记录一下,工厂模式(Factory Pattern)与策略模式(Strategy Pattern)的区别

server/2024/9/18 12:53:30/ 标签: 策略模式, 简单工厂模式

工厂模式(Factory Pattern)与策略模式(Strategy Pattern)的区别

1. 工厂模式(Factory Pattern)

**定义:**工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

**目的:**主要是用来创建对象,隐藏了对象创建的细节,使得代码更加模块化,易于管理和扩展。

分类:

  • 简单工厂模式(Simple Factory Pattern)
  • 工厂方法模式(Factory Method Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)

**适用场景:**当需要创建的对象数量较少,且创建逻辑相似时,可以使用简单工厂模式;当需要创建的对象数量较多,且创建逻辑差异较大时,可以使用工厂方法模式或抽象工厂模式。

2. 策略模式(Strategy Pattern)

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

**目的:**主要是用来定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。此模式让算法的变化独立于使用算法的客户。

**适用场景:**当存在多个算法,它们的行为相似但实现不同,或者当需要在运行时根据条件动态地选择算法时,可以使用策略模式

Java代码例子
工厂模式(简单工厂模式

java
// 产品接口  
interface Product {  void use();  
}  // 具体产品A  
class ConcreteProductA implements Product {  @Override  public void use() {  System.out.println("Using ConcreteProductA");  }  
}  // 具体产品B  
class ConcreteProductB implements Product {  @Override  public void use() {  System.out.println("Using ConcreteProductB");  }  
}  // 工厂类  
class ProductFactory {  public static Product createProduct(String type) {  if ("A".equals(type)) {  return new ConcreteProductA();  } else if ("B".equals(type)) {  return new ConcreteProductB();  }  return null;  }  
}  // 客户端  
public class FactoryPatternDemo {  public static void main(String[] args) {  Product productA = ProductFactory.createProduct("A");  productA.use();  Product productB = ProductFactory.createProduct("B");  productB.use();  }  
}

策略模式

java
// 策略接口  
interface Strategy {  void execute();  
}  // 具体策略A  
class ConcreteStrategyA implements Strategy {  @Override  public void execute() {  System.out.println("Executing strategy A");  }  
}  // 具体策略B  
class ConcreteStrategyB implements Strategy {  @Override  public void execute() {  System.out.println("Executing strategy B");  }  
}  // 上下文类  
class Context {  private Strategy strategy;  public Context(Strategy strategy) {  this.strategy = strategy;  }  public void setStrategy(Strategy strategy) {  this.strategy = strategy;  }  public void executeStrategy() {  strategy.execute();  }  
}  // 客户端  
public class StrategyPatternDemo {  public static void main(String[] args) {  Context context = new Context(new ConcreteStrategyA());  context.executeStrategy();  context.setStrategy(new ConcreteStrategyB());  context.executeStrategy();  }  
}

通过这两个例子,可以清晰地看到工厂模式和策略模式在目的、结构和适用场景上的区别。工厂模式主要用于对象的创建,而策略模式则用于定义算法族,并允许在运行时选择算法。


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

相关文章

如何划分类/单一职权原则SRP

参考:单一职责 -- 每个类只负责一个功能_每个类应该只负责一个功能,遵循单一职责原则。-CSDN博客 类有且只有一个原因需要修改它,这样的才是一个结构简洁的类。 结合上面的例子,需要注意的点: 1.比如搜索数据库,需要…

享元模式(Flyweight Pattern)

享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享大量细粒度对象来减少内存消耗。享元模式的核心思想是将多个相似的对象共享起来,从而避免对象的大量创建,节省内存资源。 场景说明 假设你正在开发一个绘…

electron 客户端 windows linux(麒麟V10)多系统离线打包 最新版 <二>

这节主要讲解以下 linux系统(国产麒麟)下,electron如何配置打包。 第一, 下载二进制包 和windows的一样,还是下载二进制包。只不过是linux版本的,千万不要下错了。 地址:CNPM Binaries Mirro…

注册安全分析报告:熊猫频道

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

大模型训练框架LLaMAFactory覆盖预训练指令微调强化学习评估全流程

1. 项目背景 开源大模型如LLaMA,Qwen,Baichuan等主要都是使用通用数据进行训练而来,其对于不同下游的使用场景和垂直领域的效果有待进一步提升,衍生出了微调训练相关的需求,包含预训练(pt)&…

梨花声音研修院退费普通话学习对国际交流的影响

随着中国在国际舞台上的影响力不断增强,普通话在国际交流中的作用日益显著。普通话不仅是中国的国家通用语言,也是全球范围内越来越重要的一种交流工具。通过学习普通话,不仅可以促进国际合作、增强留学和旅游体验,还能拓展全球就…

三菱机器人手柄维修示教器维修手操器面板等

机器人手柄维修(示教器维修)故障现象包括:黑屏、指示灯无任何显示, 上电蓝屏、白屏,通电几分钟后屏幕变为蓝屏,主板故障,通讯时有时无, 触摸失灵,有时白屏,触…

Rancher 与 Kubernetes(K8s)的关系

1. 简介 1.1 Kubernetes 作为容器编排平台 Kubernetes 是一个开源平台,用于自动化部署、扩展和管理容器化的应用。它提供了容器调度、自动伸缩、健康检查、滚动更新等功能。 例子:假设您有一个微服务架构的应用程序,需要运行在多个节…

使用Redis实现记录访问次数(三种方案)

目录 0. 前言1. 使用Filter实现2. 使用AOP实现 1. 导入依赖 2. 写一个切面类,实现统计访问次数。 3. 开启AOP 4. 测试 5. plus版本 (1) 新建一个bean类 (2) 新增一个controller方法 (3) 新增一个循环增强方法 (4) 测试…

有哪些好用的终端行为审计系统?

终端行为审计软件是用于监控、记录和分析计算机终端操作行为的工具,它们对于提高企业信息安全管理、防止内部数据泄露和提升内控水平至关重要。 1. 金刚钻信息网站行为审计系统:通过细粒化审计终端用户行为,提供文件操作日志、文件外发日志、…

神经网络卷积操作

文章目录 一、nn.Conv2d二、卷积操作原理三、代码实现卷积操作 一、nn.Conv2d nn.Conv2d 是 PyTorch 中的一个类,它代表了一个二维卷积层,通常用于处理图像数据。在深度学习和计算机视觉中,卷积层是构建卷积神经网络(CNN&#xf…

苹果账号登录后端验证两种方式 python2

import time import jwt import requests import json import base64def decode_jwt(jwt_token):try:h,p,s jwt_token.split(.)except:return {},{},{},"","",""header json.loads(base64.urlsafe_b64decode(h )) # 可能需要调整填充pa…

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略(详细思路+matlab代码+python代码+论文范例)

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次! 完整论文+代码+数据结果链接在文末! 一、第一问 问题描述:假定各种农作物未来的预期销售量、种植成本、亩产量和销售价格相对于 2023 年保持稳定,每季种植的农作物在当季销售。如果某种作物每…

互联网环境下CentOS7部署K8S

1.环境介绍 操作系统:CentOS Linux release 7.9.2009 (Core) 配置规格:2C 2G 30G VMware虚拟机 本安装手册将搭建一主两从K8S环境,并使用containerd作为容器运行时。 2.准备工作(主从节点通用) 本章节部分可在mas…

解决移动端1px 边框优化的8个方法

前言 您是否注意到 1px 边框在移动设备上有时会显得比预期的要粗?这种不一致源于移动屏幕的像素密度不同。 在 Web 开发中,我们使用 CSS 来设置页面样式。但是,CSS 中的 1px 并不总是转换为设备上的物理 1px。这种差异就是我们的“1px 边框…

UE5学习笔记21-武器的射击功能

一、创建C类 创建武器子弹的类,创建生产武器子弹的类,创建弹壳的类,生产武器子弹的类的父类是武器的类 创建后如图,ProjectileMyWeapon类(产生子弹的类)继承自weapon类,Projectile(子弹的类),Casing(弹壳声…

图像增强及运算篇之顶帽运算和底帽运算

一.图像顶帽运算 图像顶帽运算(top-hat transformation)又称为图像礼帽运算,它是用原始图像减去图像开运算后的结果,常用于解决由于光照不均匀图像分割出错的问题。其公式定义如下: 图像顶帽运算是用一个结构元通过开…

一个小例子,给你讲透 Go 配置管理,轻松将其融入到项目中

在软件开发中,配置管理是一个不可或缺的部分。无论是开发环境、测试环境还是生产环境,我们都需要一种方法来存储和读取配置信息。 在 Golang 项目中,Viper 是一个非常流行且功能强大的库,用于处理配置文件。下面我会写一些例子&am…

iOS——retain和release底层原理

retain实现原理 retain的源码: //使用此方法等价于使用[this retain] inline id objc_object::retain() {//确保对象不是tagged pointerASSERT(!isTaggedPointer());return rootRetain(false, RRVariant::FastOrMsgSend); }ALWAYS_INLINE id objc_object::rootR…

c语言--力扣简单题目(移除链表元素)讲解

题目如下; 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2,3,4,5] 示例 2: 输…