Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】

Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】

目录

Unity 设计模式 之 创造型模式-【工厂方法模式】【抽象工厂模式】

一、简单介绍

二、工厂方法模式 (Factory Method Pattern)

1、什么时候使用工厂方法模式

2、使用工厂模式的好处

3、使用工厂方法模式时的注意事项

三、在 Unity 中使用 工厂方法 模式

1、 产品接口 (Shape)

2、具体产品类 (Cube 和 Sphere)

3、工厂接口 (ShapeFactory)

4、具体工厂类 (CubeFactory 和 SphereFactory)

5、客户端代码

6、实现总结

四、抽象工厂模式 (Abstract Factory Pattern)

1、什么时候使用抽象工厂模式

2、使用抽象工厂模式的好处

3、使用抽象工厂模式时的注意事项

五、在 Unity 中使用 抽象工厂 模式

1、抽象产品接口

2、具体产品类

3、抽象工厂接口

4、具体工厂类

5、客户端代码

6、实现总结


一、简单介绍

设计模式 是指在软件开发中为解决常见问题而总结出的一套 可复用的解决方案。这些模式是经过长期实践证明有效的 编程经验总结,并可以在不同的项目中复用。设计模式并不是代码片段,而是对常见问题的 抽象解决方案,它提供了代码结构和模块间交互的一种设计思路,帮助开发者解决特定的设计问题。

设计模式的特点:

  1. 通用性:设计模式针对的是软件开发中常见的设计问题,适用于各种软件工程项目。
  2. 可复用性:设计模式可以在不同项目和环境下被重复使用,提高代码的可维护性和扩展性。
  3. 可扩展性:设计模式有助于让代码结构更加灵活,易于扩展和修改。
  4. 模块化:通过设计模式,可以减少代码的耦合性,增强模块间的独立性。
  5. 提高沟通效率:设计模式为开发者提供了一种通用的设计语言,使得团队成员能够快速理解并讨论设计方案。

二、工厂方法模式 (Factory Method Pattern)

工厂方法模式 是一种创建型设计模式,用于定义一个用于创建对象的接口,但让子类决定实例化哪个具体类。它将 实例化对象的任务 推迟给子类,以解决创建对象时可能产生的耦合问题。

工厂方法模式的工作原理:

工厂方法模式的核心思想是 推迟实例化,将对象的创建延迟到子类中。通过定义一个抽象工厂类,客户端可以通过这个工厂接口生成产品对象,而不需要知道具体的类名,避免了直接使用 new 关键字创建对象。子类负责实现工厂方法,根据不同的业务需求来决定返回哪个产品对象。

工厂方法模式主要有以下几个组成部分:

  1. 产品接口(Product):定义所创建对象的通用接口。
  2. 具体产品类(ConcreteProduct):实现产品接口的具体类,表示不同的对象类型。
  3. 工厂接口(Creator):声明工厂方法,它返回产品接口的实例,通常是抽象类或接口。
  4. 具体工厂类(ConcreteCreator):实现工厂接口,并负责具体产品对象的实例化。

工厂方法模式的结构图

  1. Product:抽象产品
  2. ConcreteProduct:具体产品
  3. Creator:抽象工厂(包含工厂方法)
  4. ConcreteCreator:具体工厂
classDiagramclass Creator {<<abstract>>+ factoryMethod() Product}class ConcreteCreator {+ factoryMethod() ConcreteProduct}class Product {<<abstract>>}class ConcreteProduct {}Creator <-- ConcreteCreatorCreator --> ProductConcreteCreator --> ConcreteProductProduct <|-- ConcreteProduct

1、什么时候使用工厂方法模式

  1. 对象创建过程复杂且可能发生变化时

    • 如果对象的创建过程涉及多个步骤,或者需要初始化大量参数,可以使用工厂方法模式将这些复杂的创建过程封装起来。当对象创建的逻辑变得更加复杂时,可以通过扩展工厂来简化代码维护。
  2. 当需要遵循开闭原则时

    • 如果系统需要根据不同的需求扩展不同的产品类,且不希望修改现有代码,工厂方法模式是理想选择。通过扩展新的具体工厂类,可以实现新的对象类型,而不影响现有系统。
  3. 系统中有许多类似的对象,且需要灵活的控制其创建过程时

    • 在某些情况下,系统中可能有多种不同的对象,每个对象都有各自的创建方式,使用工厂方法模式可以灵活地决定创建哪种类型的对象,而不必直接依赖于具体类。
  4. 当具体类的初始化工作依赖于外部资源时

    • 例如,在游戏开发中,工厂方法可以用来创建游戏对象,将资源加载、配置和初始化的过程封装在工厂中。

2、使用工厂模式的好处

  1. 解耦对象创建和使用

    • 工厂方法模式将对象的创建逻辑与业务逻辑分离,避免了在代码中直接实例化对象(使用 new 关键字),从而降低了代码的耦合性。
  2. 提高代码的扩展性

    • 工厂方法模式符合开闭原则(OCP),当需要添加新产品时,不需要修改现有代码,只需增加新的具体产品类和对应的工厂实现。这使得系统在面对新需求时可以轻松扩展。
  3. 简化对象创建过程

    • 对于某些复杂对象的创建过程,工厂模式隐藏了这些细节,只需调用工厂方法即可获得对象实例。工厂封装了具体的创建逻辑,客户端不必关心对象的构造过程。
  4. 增强代码可维护性

    • 通过将对象创建逻辑封装在工厂中,所有对象的生成都集中管理。如果需要修改某类对象的创建过程,只需修改工厂类即可,不会影响到其他使用该对象的代码。
  5. 支持不同的对象实例化

    • 工厂方法模式允许在运行时决定生成何种对象实例,提供了更大的灵活性。例如,不同的子类可以根据业务逻辑创建不同的产品,而不用修改原有代码。

3、使用工厂方法模式时的注意事项

  1. 工厂类的数量增加

    • 如果系统中有很多不同的产品类型,会产生大量的具体工厂类,增加了类的数量。可以通过简单工厂模式抽象工厂模式来减少工厂类数量。
  2. 增加了代码的复杂性

    • 工厂方法模式虽然提供了灵活性,但也增加了代码的复杂性,特别是在需要创建大量具体产品时,必须为每个产品创建单独的工厂类。
  3. 适合对象创建逻辑复杂的情况

    • 如果对象的创建过程非常简单,使用工厂方法模式可能会显得过于复杂,直接实例化对象反而更简洁明了。

三、在 Unity 中使用 工厂方法 模式

在 Unity 中使用 工厂方法模式 生成不同的3D对象(如立方体、球体)是一个非常实际的应用场景。Unity 提供了GameObject.CreatePrimitive() 方法来创建基本的3D对象。我们可以通过 工厂方法模式 封装创建逻辑,以实现更灵活的对象创建方式。

步骤

  1. 定义产品接口:在这个例子中,IShape 接口定义了所有形状的通用方法。
  2. 具体产品类:实现 IShape 接口的具体类,如 CubeSphere
  3. 工厂接口:定义创建形状的工厂方法。
  4. 具体工厂类:提供不同具体形状的工厂类,如 CubeFactorySphereFactory

1、 产品接口 (Shape)

首先,我们定义一个抽象类 Shape,作为所有形状的基类。每个形状都有一个 Create() 方法,用于实例化具体的形状对象。

public abstract class AbShape
{public abstract GameObject Create(Vector3 position, Color color);
}

2、具体产品类 (Cube 和 Sphere)

我们定义两个具体产品类 CubeSphere,分别表示立方体和球体。

2.1 立方体类:Cube

public class Cube : AbShape
{public override GameObject Create(Vector3 position, Color color){GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube); // 创建立方体cube.transform.position = position; // 设置位置Renderer renderer = cube.GetComponent<Renderer>();renderer.material.color = color; // 设置颜色return cube;}
}

2.2 球体类:Sphere

public class Sphere : AbShape
{public override GameObject Create(Vector3 position, Color color){GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); // 创建球体sphere.transform.position = position; // 设置位置Renderer renderer = sphere.GetComponent<Renderer>();renderer.material.color = color; // 设置颜色return sphere;}
}

3、工厂接口 (ShapeFactory)

定义一个抽象的工厂类 ShapeFactory,它包含一个工厂方法 CreateShape(),用于返回具体形状的对象。

public abstract class ShapeFactory
{public abstract AbShape CreateShape();
}

4、具体工厂类 (CubeFactory 和 SphereFactory)

我们为每个具体的形状类创建对应的工厂类,CubeFactorySphereFactory,它们分别实现了 ShapeFactory

4.1 立方体工厂:CubeFactory

public class CubeFactory : ShapeFactory
{public override IShape CreateShape(){return new Cube(); // 返回立方体实例}
}

4.2 球体工厂:SphereFactory

public class SphereFactory : ShapeFactory
{public override IShape CreateShape(){return new Sphere(); // 返回球体实例}
}

5、客户端代码

GameManager 或任意脚本中调用工厂方法来动态创建对象。通过使用 CreateShape() 方法,客户端可以生成不同类型的 3D 对象,而无需直接依赖具体类。

public class ShapeGenerator : MonoBehaviour
{private void Start(){// 创建 CubeFactory 实例并生成立方体ShapeFactory cubeFactory = new CubeFactory();AbShape cube = cubeFactory.CreateShape();cube.Create(new Vector3(0, 0, 0), Color.red); // 在 (0, 0, 0) 位置生成红色立方体// 创建 SphereFactory 实例并生成球体ShapeFactory sphereFactory = new SphereFactory();AbShape sphere = sphereFactory.CreateShape();sphere.Create(new Vector3(2, 0, 0), Color.blue); // 在 (2, 0, 0) 位置生成蓝色球体}
}

6、实现总结

  • AbShape:抽象的产品类,定义形状的接口。
  • Cube 和 Sphere:具体产品类,分别实现了立方体和球体的创建逻辑。
  • ShapeFactory:抽象工厂类,定义了 CreateShape() 方法。
  • CubeFactory 和 SphereFactory:具体工厂类,用于创建相应的形状对象。
  • ShapeGenerator:客户端,动态生成不同的 3D 对象。

通过工厂方法模式,Unity 的 3D 对象创建逻辑被很好地封装在工厂和产品类中,扩展新的 3D 对象也非常方便,比如可以添加更多的形状(如圆柱体、胶囊体等)而不需要修改现有代码。

四、抽象工厂模式 (Abstract Factory Pattern)

抽象工厂模式 (Abstract Factory Pattern)  是一种创建型设计模式,它提供了一个接口,允许客户端创建一系列相关或依赖的对象,而无需指定其具体类。抽象工厂模式通常用于创建一族相互关联的对象,并确保这些对象能够一起工作。

工厂方法模式 不同,抽象工厂不仅创建单个产品,还可以创建多个相关的产品对象。抽象工厂通过定义多个工厂方法,帮助客户端创建不同类型的相关产品。

抽象工厂模式的工作原理

  1. 抽象工厂定义了创建产品族的接口:该接口包含多个工厂方法,每个工厂方法用于创建一种产品。
  2. 具体工厂类实现这些工厂方法:每个具体工厂都负责创建一组相关的产品。它们返回具体产品的实例,并确保产品之间可以协同工作。
  3. 客户端只依赖于抽象工厂和抽象产品接口:客户端使用抽象工厂创建产品,而不需要了解具体产品类。通过依赖抽象接口,客户端可以灵活地使用不同的具体工厂来生成不同的一组产品。

抽象工厂模式的组成

  1. 抽象工厂(Abstract Factory):定义创建一组相关对象的方法。
  2. 具体工厂(Concrete Factory):实现抽象工厂接口,创建不同具体产品的实例。
  3. 抽象产品(Abstract Product):为每种类型的产品定义接口或抽象类。
  4. 具体产品(Concrete Product):实现抽象产品接口或继承抽象类,表示具体的产品对象。
  5. 客户端(Client):使用抽象工厂来创建一组产品,使用时只依赖于抽象工厂和抽象产品的接口。

抽象工厂模式的结构图

  1. AbstractFactory:抽象工厂
  2. ConcreteFactory:具体工厂
  3. AbstractProductA:抽象产品A
  4. ConcreteProductA:具体产品A
  5. AbstractProductB:抽象产品B
  6. ConcreteProductB:具体产品B
classDiagramclass AbstractFactory {<<abstract>>+ CreateProductA() AbstractProductA+ CreateProductB() AbstractProductB}class ConcreteFactory1 {+ CreateProductA() ConcreteProductA1+ CreateProductB() ConcreteProductB1}class ConcreteFactory2 {+ CreateProductA() ConcreteProductA2+ CreateProductB() ConcreteProductB2}class AbstractProductA {<<abstract>>}class AbstractProductB {<<abstract>>}class ConcreteProductA1 {}class ConcreteProductA2 {}class ConcreteProductB1 {}class ConcreteProductB2 {}AbstractFactory <|-- ConcreteFactory1AbstractFactory <|-- ConcreteFactory2AbstractFactory --> AbstractProductAAbstractFactory --> AbstractProductBAbstractProductA <|-- ConcreteProductA1AbstractProductA <|-- ConcreteProductA2AbstractProductB <|-- ConcreteProductB1AbstractProductB <|-- ConcreteProductB2

1、什么时候使用抽象工厂模式

  1. 系统中有多个相关或依赖的产品需要创建时

    • 当系统需要创建多个相关对象,且这些对象可能属于不同的产品族时,使用抽象工厂模式可以有效地管理这些对象的创建。比如,创建不同风格的UI组件(按钮、文本框等)时,每个风格的组件需要一致性。
  2. 当产品的类型和数量会随着需求变化时

    • 如果产品种类较多且可能随着需求扩展,使用抽象工厂模式可以方便地增加新的产品族和产品,而无需修改客户端代码。
  3. 确保一系列对象能够一起使用时

    • 抽象工厂模式适合于需要保证一组对象能够协同工作、风格一致的场景。比如游戏中的不同敌人类型及其行为,或不同平台的UI组件库等。
  4. 需要遵循开闭原则时

    • 抽象工厂模式适用于那些需要经常扩展但不希望频繁修改代码的系统。通过新增具体工厂和产品,可以在不修改现有代码的前提下扩展系统功能。

2、使用抽象工厂模式的好处

  1. 提高代码的可扩展性

    • 抽象工厂模式使系统易于扩展,符合开闭原则。如果需要扩展新的产品族,只需创建新的具体工厂类和对应的产品类,而不需要修改现有代码。
  2. 解耦产品的创建和使用

    • 抽象工厂模式将产品的创建逻辑从客户端代码中移除,客户端不直接依赖具体类。这种解耦增强了代码的灵活性,使得客户端代码更容易维护和扩展。
  3. 确保产品族的一致性

    • 抽象工厂模式能确保创建的产品之间是相互兼容的。如果某个产品依赖于另一个产品(如UI组件的不同风格),抽象工厂可以保证这些相关产品能够协同工作。
  4. 简化对象创建过程

    • 对于涉及多个相关对象的复杂系统,抽象工厂模式可以简化对象的创建过程,避免了客户端需要分别创建不同对象的麻烦。

3、使用抽象工厂模式时的注意事项

  1. 抽象工厂模式适合用于管理一组相关对象:如果系统中的对象彼此相关(如UI组件、游戏角色等),抽象工厂模式可以简化管理这些对象的复杂性。

  2. 扩展产品族较为复杂:虽然增加新的产品类型很方便,但如果增加新的产品族,可能需要大量修改现有工厂。

  3. 保持产品族的一致性:在创建多个相关产品时,确保所有产品都来自同一个工厂,保持它们的一致性和兼容性。

五、在 Unity 中使用 抽象工厂 模式

在 Unity 中使用抽象工厂模式,我们可以根据时间的不同(如早晨、下午和晚上)来为 UI 元素(如按钮、文本框等)提供不同的颜色风格。我们可以为每个时间段设计不同的工厂,通过抽象工厂接口创建不同的按钮和文本框实例,并动态应用这些主题。

设计步骤

  1. 抽象产品:定义 UI 组件接口(如按钮、文本框等),并为每个组件实现 Render 方法。
  2. 具体产品:根据不同的时间段(早晨、下午、晚上)实现不同颜色风格的按钮和文本框。
  3. 抽象工厂:定义一个抽象工厂接口,包含创建按钮和文本框的方法。
  4. 具体工厂:根据时间段实现具体的工厂类,负责创建对应时间段的 UI 组件。
  5. 客户端:根据当前时间,使用不同的工厂创建和渲染 UI。

1、抽象产品接口

// 抽象产品A - 按钮
public interface IButton
{void Render();
}// 抽象产品B - 文本框
public interface ITextBox
{void Render();
}

2、具体产品类

// 早晨风格的按钮
public class MorningButton : IButton
{public void Render(){Debug.Log("Rendering a Morning-style Button with light yellow.");// 设置实际的 UI 样式或颜色}
}// 下午风格的按钮
public class AfternoonButton : IButton
{public void Render(){Debug.Log("Rendering an Afternoon-style Button with warm orange.");// 设置实际的 UI 样式或颜色}
}// 晚上风格的按钮
public class NightButton : IButton
{public void Render(){Debug.Log("Rendering a Night-style Button with dark blue.");// 设置实际的 UI 样式或颜色}
}// 早晨风格的文本框
public class MorningTextBox : ITextBox
{public void Render(){Debug.Log("Rendering a Morning-style TextBox with light yellow background.");// 设置实际的 UI 样式或颜色}
}// 下午风格的文本框
public class AfternoonTextBox : ITextBox
{public void Render(){Debug.Log("Rendering an Afternoon-style TextBox with warm orange background.");// 设置实际的 UI 样式或颜色}
}// 晚上风格的文本框
public class NightTextBox : ITextBox
{public void Render(){Debug.Log("Rendering a Night-style TextBox with dark blue background.");// 设置实际的 UI 样式或颜色}
}

3、抽象工厂接口

// 抽象工厂接口
public interface IUIFactory
{IButton CreateButton();ITextBox CreateTextBox();
}

4、具体工厂类

// 早晨风格工厂
public class MorningUIFactory : IUIFactory
{public IButton CreateButton(){return new MorningButton();}public ITextBox CreateTextBox(){return new MorningTextBox();}
}// 下午风格工厂
public class AfternoonUIFactory : IUIFactory
{public IButton CreateButton(){return new AfternoonButton();}public ITextBox CreateTextBox(){return new AfternoonTextBox();}
}// 晚上风格工厂
public class NightUIFactory : IUIFactory
{public IButton CreateButton(){return new NightButton();}public ITextBox CreateTextBox(){return new NightTextBox();}
}

5、客户端代码

public class UIDisplay : MonoBehaviour
{private IUIFactory uiFactory;private void Start(){// 根据当前时间获取对应的工厂uiFactory = GetFactoryByTime();// 使用工厂创建并渲染UI组件IButton button = uiFactory.CreateButton();ITextBox textBox = uiFactory.CreateTextBox();button.Render();textBox.Render();}private IUIFactory GetFactoryByTime(){// 获取当前时间的小时int hour = System.DateTime.Now.Hour;if (hour >= 6 && hour < 12){// 早晨6点到12点return new MorningUIFactory();}else if (hour >= 12 && hour < 18){// 下午12点到18点return new AfternoonUIFactory();}else{// 晚上18点到6点return new NightUIFactory();}}
}

6、实现总结

  1. 抽象产品接口 (IButtonITextBox):定义了通用的 UI 组件方法 Render,用于在游戏中展示 UI 元素。
  2. 具体产品类 (MorningButton, AfternoonButton, NightButton 等):这些类实现了具体的按钮和文本框,根据不同的时间段来渲染不同的颜色风格。
  3. 抽象工厂接口 (IUIFactory):定义了用于创建不同 UI 元素的方法,如按钮和文本框。
  4. 具体工厂类 (MorningUIFactory, AfternoonUIFactory, NightUIFactory):分别根据早晨、下午和晚上的不同,创建相应颜色风格的按钮和文本框。
  5. 客户端 (UIDisplay):根据当前时间,动态选择对应的工厂生成 UI 元素,并调用 Render 方法进行渲染。

解耦创建和使用,UI 元素的创建与其使用分离,客户端代码不需要关心具体的 UI 组件实现。

灵活应对时间变化,客户端可以根据当前时间灵活选择不同的工厂,动态生成适合的 UI 主题。

易于扩展,如果需要支持新的时间段(例如黄昏、黎明),可以方便地添加新的具体工厂和产品,而无需修改客户端代码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/427374.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Pyramid Vision Transformer》论文笔记

原文笔记 What 为了解决VIT在视觉任务上的局限性并且探究Transformer模型在视觉任务上的应用&#xff0c;这项工作提出了一种纯 Transformer 主干&#xff0c;称为 Pyramid Vision Transformer (PVT)&#xff0c;它可以作为 CNN 主干在许多下游任务中的替代方案&#xff0c;包…

全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类

全网最适合入门的面向对象编程教程&#xff1a;50 Python 函数方法与接口-接口和抽象基类 摘要&#xff1a; 在 Python 中&#xff0c;接口和抽象基类&#xff08;Abstract Base Classes, ABCs&#xff09;都用于定义类的结构和强制子类实现特定的方法&#xff0c;Python 没有…

基于ExtendSim的 电子制造 仿真模型

说明&#xff1a; 此模型表示电路板制造设施。该过程有4个步骤&#xff1a; *焊料制备 *组件放置 *烤箱 *检查 详情&#xff1a; *烤箱的容量为10张卡&#xff0c;但如果烤箱循环开始时仅能处理5张卡&#xff0c;则最多只能处理5张。 *如果检查员发现问题&#xff0c;他们将修理…

【STM32系统】基于STM32设计的SD卡数据读取与上位机显示系统(SDIO接口驱动、雷龙SD卡)——文末资料下载

基于STM32设计的SD卡数据读取与上位机显示系统 演示视频&#xff1a; 基于STM32设计的SD卡数据读取与上位机显示系统 简介&#xff1a;本研究的主要目的是基于STM32F103微控制器&#xff0c;设计一个能够读取SD卡数据并显示到上位机的系统。SD卡的数据扇区读取不仅是为了验证存…

考研数据结构——C语言实现无向图邻接矩阵

首先&#xff0c;定义了一些基本的数据结构和常量&#xff1a; VertexType 和 EdgeType 分别用于表示图中的顶点和边的权重。MAXVEX 定义了图中最大顶点数为100。INFINITY 用于表示顶点之间没有直接的边相连&#xff0c;这里用65535作为无穷大的表示。 定义了一个图的结构体 MG…

react + antDesign封装图片预览组件(支持多张图片)

需求场景&#xff1a;最近在开发后台系统时经常遇到图片预览问题&#xff0c;如果一个一个的引用antDesign的图片预览组件就有点繁琐了&#xff0c;于是在antDesign图片预览组件的基础上二次封装了一下&#xff0c;避免重复无用代码的出现 效果 公共预览组件代码 import React…

网站建设的服务器该如何选择?

服务器的选择对于网站的稳定运行、性能表现以及成本控制至关重要。以下是一些关键的考虑因素&#xff0c;帮助你选择适合的服务器&#xff1a; 明确需求&#xff1a;你需要先明确网站的需求和目标。这包括确定服务器将用于托管什么样的应用&#xff08;如Web前端、应用服务器、…

基于vue框架的宠物寻回小程序8g7el(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;发布人,宠物分类,宠物信息,接取人,接取信息,完成信息 开题报告内容 基于Vue框架的宠物寻回小程序开题报告 一、研究背景与意义 随着城市化进程的加快和人们生活水平的提高&#xff0c;宠物已成为许多家庭不可或缺的一员。它们不仅为生…

RK3568平台(网络篇)MAC地址烧录

一.max地址简介 MAC地址(Media Access Control Address)也称为硬件地址或物理地址(Physical Address),它是一个用来确认网络设备位置的位址。在OSI模型中,第二层数据链路层则负责MAC位址 。MAC地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都…

[数据集][目标检测]俯拍航拍森林火灾检测数据集VOC+YOLO格式6116张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;6116 标注数量(xml文件个数)&#xff1a;6116 标注数量(txt文件个数)&#xff1a;6116 标注…

Mamba YOLO World

论文地址&#xff1a;https://arxiv.org/pdf/2409.08513v1 代码地址&#xff1a; GitHub - Xuan-World/Mamba-YOLO-World: Mamba-YOLO-World: Marrying YOLO-World with Mamba for Open-Vocabulary Detection 开集检测&#xff08;OVD&#xff09;旨在检测预定义类别之外的物体…

gma 2.0.13 (2024.09.16) 更新日志

安装 gma 2.0.13 pip install gma2.0.13网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1P0nmZUPMJaPEmYgixoL2QQ?pwd1pc8 提取码&#xff1a;1pc8 注意&#xff1a;此版本没有Linux版&#xff01; 编译gma的Linux虚拟机没有时间修复&#xff0c;本期Linux版…

基于SpringBoot+Vue的企业会议室预定管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSpringBootVueMySQL的…

【iOS】——JSONModel源码

JSONModel用法 基本用法 将传入的字典转换成模型&#xff1a; 首先定义模型类&#xff1a; interface Person : JSONModel property (nonatomic, copy) NSString *name; property (nonatomic, copy) NSString *sex; property (nonatomic, assign) NSInteger age; end接…

相亲交易系统源码详解与开发指南

随着互联网技术的发展&#xff0c;越来越多的传统行业开始寻求线上转型&#xff0c;其中就包括婚恋服务。传统的相亲方式已经不能满足现代人快节奏的生活需求&#xff0c;因此&#xff0c;开发一款基于Web的相亲交易系统显得尤为重要开发者h17711347205。本文将详细介绍如何使用…

FinGPT金融大模型

FinGPT仓库https://github.com/AI4Finance-Foundation/FinGPT 功能&#xff1a; Adviser。根据新闻判断市场情绪&#xff08;积极、消极、中性&#xff09;&#xff0c;给出投资建议。Quantitative Trading。定制属于自己的金融助手。叫它关注某几个股票、监测消息等。可以直…

Comsol 多孔弹性波应用三:吸声器(超宽频带)

超宽频带吸声材料&#xff08;Ultra-wideband absorbing materials&#xff09;是指能够在非常宽的频率范围内吸收声波的材料。传统的吸声材料通常只能在较窄的频率范围内有效吸收声波&#xff0c;而超宽频带吸声材料可以在更广泛的频率范围内实现高效的吸声效果。这使得超宽频…

光伏业务管理系统:全流程管理成重点

一、光伏业务管理的挑战 光伏业务管理涉及项目规划、设计选型、施工建设、运营维护、数据分析等多个环节&#xff0c;每一个环节都直接关系到项目的经济性、安全性和可持续性。传统的管理方式往往存在信息不对称、流程不透明、响应速度慢等问题&#xff0c;难以适应光伏产业快…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张&#xff0c;越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加&#xff0c;同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时&#xff0c;救援人员需要迅速了解现场的…

面试官:什么是CAS?存在什么问题?

大家好&#xff0c;我是大明哥&#xff0c;一个专注「死磕 Java」系列创作的硬核程序员。 回答 CAS&#xff0c;Compare And Swap&#xff0c;即比较并交换&#xff0c;它一种无锁编程技术的核心机制。其工作方式分为两步&#xff1a; 比较&#xff1a;它首先会比较内存中的某…