设计模式|工厂模式
文章目录
- 1. 工厂模式的三种实现
- 2. 简单工厂模式和工厂方法模式示例
- 3. 抽象工厂模式示例
- 4. 工厂模式与多态的关系
- 5. 工程模式与策略模式的关系
- 6. 面试中可能遇到的问题
- 6.1 **工厂模式的概念是什么?**
- 6.2 **工厂模式解决了什么问题?**
- 6.3 **工厂模式的优点是什么?**
- 6.4 **工厂模式有哪些不同的实现方式?**
- 6.5 **举例说明简单工厂模式、工厂方法模式和抽象工厂模式的实现吗?**
- 6.6 **工厂模式在什么场景下使用比较合适?**
- 6.7 **使用工厂模式有什么优点?它解决了哪些问题?**
- 6.8 **工厂模式有什么缺点?在什么情况下不适合使用?**
- 6.9 **能否举例说明工厂模式在实际项目中的应用场景?**
- 6.10 **工厂模式和抽象工厂模式有什么区别?**
- 6.11 **工厂模式和建造者模式有什么区别?它们在解决问题时有何异同?**
- 6.12 **工厂模式和单例模式之间有什么关系?它们之间有何联系?**
- 6.13 **在你之前的项目中是否使用过工厂模式?能否分享一些具体的应用经验?**
- 6.14 **能够列举一些知名的框架或库中使用了工厂模式的例子吗?**
- 6.15 **工厂模式是如何符合设计原则的?它与哪些设计原则相关?**
- 附录 demo

工厂模式是一种常见的设计模式,在Java开发中被广泛应用。它属于创建型设计模式,旨在提供一种封装对象创建过程的方法,使得客户端代码可以与具体创建对象的过程解耦。
1. 工厂模式的三种实现
在Java中,工厂模式通常有三种实现方式:简单工厂模式、工厂方法模式和抽象工厂模式。
- 简单工厂模式(Simple Factory Pattern):
- 简单工厂模式通过一个工厂类来创建对象,客户端通过传递不同的参数给工厂类,工厂类根据参数的不同来创建不同的对象实例。
- 优点是客户端代码简单,隐藏了具体对象的创建细节。
- 缺点是当需要添加新的产品时,需要修改工厂类的代码,违反了开闭原则。
- 工厂方法模式(Factory Method Pattern):
- 工厂方法模式将对象的创建延迟到子类中去实现,即定义一个创建对象的接口,但让子类决定实例化哪个类。
- 客户端通过调用工厂方法来创建对象,具体的实例化过程由子类负责。
- 这样可以解决简单工厂模式中的缺点,使得系统更具灵活性和可扩展性。
- 抽象工厂模式(Abstract Factory Pattern):
- 抽象工厂模式提供一个接口用于创建一系列相关或依赖对象的家族,而不需要指定具体的类。
- 与工厂方法模式相比,抽象工厂模式是针对多个产品等级结构的,可以创建不同产品族的全部产品。
- 这种模式适用于需要在运行时切换不同产品族的场景,但增加新的产品族往往不太容易。
2. 简单工厂模式和工厂方法模式示例
// 简单工厂模式示例
class SimpleFactory {public static Product createProduct(String type) {if (type.equals("A")) {return new ConcreteProductA();} else if (type.equals("B")) {return new ConcreteProductB();} else {return null;}}
}interface Product {void doSomething();
}class ConcreteProductA implements Product {public void doSomething() {System.out.println("Product A");}
}class ConcreteProductB implements Product {public void doSomething() {System.out.println("Product B");}
}// 工厂方法模式示例
interface Factory {Product createProduct();
}class ConcreteFactoryA implements Factory {public Product createProduct() {return new ConcreteProductA();}
}class ConcreteFactoryB implements Factory {public Product createProduct() {return new ConcreteProductB();}
}public class Main {public static void main(String[] args) {// 简单工厂模式示例Product productA = SimpleFactory.createProduct("A");productA.doSomething();// 工厂方法模式示例Factory factoryA = new ConcreteFactoryA();Product productB = factoryA.createProduct();productB.doSomething();}
}
以上示例中,简单工厂模式中的 SimpleFactory
负责创建具体产品对象,而工厂方法模式中的 Factory
接口定义了创建产品的方法,具体的产品创建由不同的具体工厂类实现。
3. 抽象工厂模式示例
// 抽象工厂模式示例
interface AbstractFactory {AbstractProductA createProductA();AbstractProductB createProductB();
}interface AbstractProductA {void doSomething();
}interface AbstractProductB {void doSomething();
}class ConcreteFactory1 implements AbstractFactory {public AbstractProductA createProductA() {return new ConcreteProductA1();}public AbstractProductB createProductB() {return new ConcreteProductB1();}
}class ConcreteFactory2 implements AbstractFactory {public AbstractProductA createProductA() {return new ConcreteProductA2();}public AbstractProductB createProductB() {return new ConcreteProductB2();}
}class ConcreteProductA1 implements AbstractProductA {public void doSomething() {System.out.println("Product A1");}
}class ConcreteProductA2 implements AbstractProductA {public void doSomething() {System.out.println("Product A2");}
}class ConcreteProductB1 implements AbstractProductB {public void doSomething() {System.out.println("Product B1");}
}class ConcreteProductB2 implements AbstractProductB {public void doSomething() {System.out.println("Product B2");}
}public class Main {public static void main(String[] args) {AbstractFactory factory1 = new ConcreteFactory1();AbstractProductA productA1 = factory1.createProductA();AbstractProductB productB1 = factory1.createProductB();productA1.doSomething();productB1.doSomething();AbstractFactory factory2 = new ConcreteFactory2();AbstractProductA productA2 = factory2.createProductA();AbstractProductB productB2 = factory2.createProductB();productA2.doSomething();productB2.doSomething();}
}
- 在这个示例中,
AbstractFactory
是抽象工厂接口,定义了创建一组相关产品的方法。 ConcreteFactory1
和ConcreteFactory2
是具体工厂类,分别实现了抽象工厂接口,用于创建一组特定的产品。AbstractProductA
和AbstractProductB
是抽象产品接口,分别定义了产品 A 和产品 B 的方法。ConcreteProductA1
、ConcreteProductA2
、ConcreteProductB1
和ConcreteProductB2
是具体产品类,分别实现了抽象产品接口,用于提供具体的产品功能。- 在
Main
类中,通过创建不同的具体工厂对象来获取不同的产品族,然后调用产品的方法来实现具体的功能。
4. 工厂模式与多态的关系
工厂模式与多态之间有着密切的关系,因为工厂模式往往利用了多态的特性来实现对象的创建和使用。
多态是面向对象编程中的一个重要概念,它允许不同的对象对同一个消息作出不同的响应。在Java中,多态性可以通过继承和接口实现,其中子类或实现了接口的类可以覆写父类或接口中的方法,实现方法的多态性。
工厂模式利用多态性来实现创建对象的过程,具体来说:
- 工厂方法模式
- 工厂方法模式中,工厂类定义了一个创建产品的抽象方法,具体的产品创建延迟到具体的子类工厂中去实现。
- 这里的多态性体现在客户端通过调用工厂方法来创建对象,而不需要关心具体的实现类是哪个,具体的实例化过程由子类负责,从而达到了解耦的目的。
- 抽象工厂模式
- 抽象工厂模式中,抽象工厂定义了创建一系列相关或依赖对象的接口,具体的产品族创建由具体的工厂类去实现。
- 这里的多态性体现在客户端针对抽象工厂编程,而不需要关心具体的工厂类是哪个,具体的工厂类根据客户端的选择来创建不同的产品族。
总的来说,工厂模式通过利用多态性,将对象的创建过程和客户端代码解耦,提高了代码的灵活性和可维护性。在使用工厂模式时,客户端通常面向工厂接口或抽象工厂类编程,从而利用多态性来实现不同产品的创建和使用。
5. 工程模式与策略模式的关系
工厂模式(Factory Pattern)和策略模式(Strategy Pattern)是两种不同类型的设计模式,它们解决了不同的问题,但有时候也可以结合使用,互相配合,以达到更好的设计效果。
- 工厂模式:
- 工厂模式旨在提供一种封装对象创建过程的方法,使得客户端代码可以与具体创建对象的过程解耦。
- 工厂模式根据需要实例化的对象类型,通过工厂类来创建对象,客户端只需要与工厂接口或抽象工厂类交互,而不需要直接与具体产品类交互。
- 工厂模式通常用于创建对象的场景,比如创建数据库连接、日志记录器等。
- 策略模式:
- 策略模式旨在定义一系列算法,并将每个算法封装起来,使它们可以互相替换,从而使算法的变化独立于使用算法的客户端。
- 策略模式通过定义一个接口或抽象类来封装算法族,然后通过具体的策略类来实现具体的算法,客户端可以根据需要选择不同的策略来使用。
- 策略模式通常用于算法的变化频繁、需要在运行时动态选择算法或者需要将算法与客户端解耦的场景。
虽然工厂模式和策略模式解决了不同的问题,但在某些情况下它们可以结合使用:
- 策略模式的工厂:在策略模式中,具体的策略类通常由客户端根据需要进行选择,而这个选择过程也可以由工厂模式来完成。工厂类可以根据某些条件或者策略来实例化具体的策略对象,从而使客户端更加灵活地选择策略。
- 工厂模式中的策略:在工厂模式中,工厂类可以被视为一种策略的实现,根据客户端的需求选择合适的工厂来创建对象,这样客户端就可以在不同的情况下使用不同的创建策略。
综上所述,工厂模式和策略模式虽然解决了不同的问题,但在一些情况下可以结合使用,以满足更复杂的设计需求。
6. 面试中可能遇到的问题
与工厂模式相关的问题可能涉及到工厂模式的概念、使用场景、实现方式以及与其他设计模式的比较等方面。以下是一些可能会被问及的问题
6.1 工厂模式的概念是什么?
- 工厂模式是一种创建型设计模式,它提供了一种封装对象创建过程的方法,使得客户端代码可以与具体创建对象的过程解耦。
- 其核心思想是通过工厂类来创建对象,而不是直接在客户端代码中通过 new 操作符实例化对象。
6.2 工厂模式解决了什么问题?
- 工厂模式解决了客户端代码与具体对象创建过程之间的耦合问题。它使得客户端不需要知道对象的具体创建细节,只需要通过工厂类来获取所需的对象实例。
6.3 工厂模式的优点是什么?
- 解耦客户端和具体类的实现,降低了代码的依赖性;
- 提供了一种统一的接口来创建对象,使得客户端代码更加灵活和可维护;
- 可以隐藏对象创建的细节,对客户端代码进行了抽象。
6.4 工厂模式有哪些不同的实现方式?
工厂模式有三种主要的实现方式:
- 简单工厂模式、工厂方法模式和抽象工厂模式。
- 简单工厂模式通过一个工厂类来创建对象;
- 工厂方法模式将对象的创建延迟到具体的子类中去实现;
- 而抽象工厂模式提供一个接口用于创建一系列相关或依赖对象的家族,而不需要指定具体的类。
6.5 举例说明简单工厂模式、工厂方法模式和抽象工厂模式的实现吗?
- 简单工厂模式示例:一个汽车制造工厂(CarFactory)生产不同型号的汽车(例如:奥迪、宝马、奔驰)。
- 工厂方法模式示例:一个汽车制造工厂(CarFactory)接口定义了生产汽车的抽象方法,具体的汽车制造工厂(例如:奥迪工厂、宝马工厂、奔驰工厂)继承该接口,并实现了具体的汽车生产方法。
- 抽象工厂模式示例:一个汽车配件制造工厂(CarPartsFactory)接口定义了生产汽车零件的抽象方法,具体的汽车配件制造工厂(例如:德国工厂、日本工厂)继承该接口,并实现了具体的汽车零件生产方法。
6.6 工厂模式在什么场景下使用比较合适?
- 工厂模式适用于需要根据不同条件创建不同类型对象的场景,以及对象的创建过程比较复杂、需要隐藏创建细节的场景。
- 它特别适用于需要创建一系列相关对象或对象族的情况。
6.7 使用工厂模式有什么优点?它解决了哪些问题?
- 工厂模式的优点包括:解耦、灵活性和可维护性。
- 它将对象的创建过程集中在一个地方,使得客户端代码更加简洁、灵活,并且易于扩展和维护。
6.8 工厂模式有什么缺点?在什么情况下不适合使用?
- 工厂模式的缺点是如果产品种类过多,会导致工厂类代码过于复杂;
- 并且在简单工厂模式在添加新产品时,需要修改工厂类,违反了开闭原则。不适合在产品种类频繁变化的场景中使用。
6.9 能否举例说明工厂模式在实际项目中的应用场景?
- 工厂模式在实际项目中有许多应用场景,例如在数据库访问框架中,通过工厂模式来创建不同类型的数据库连接对象;在日志记录框架中,通过工厂模式来创建不同类型的日志记录器对象等。
6.10 工厂模式和抽象工厂模式有什么区别?
- 工厂模式关注于创建单个对象,它提供了一个统一的接口来创建对象;
- 而抽象工厂模式关注于创建一系列相关或依赖对象的家族,它提供了一个接口来创建不同类型对象的多个系列;
- 它们适用于不同的场景,工厂模式适用于创建单个对象,而抽象工厂模式适用于创建多个相关对象的家族。
6.11 工厂模式和建造者模式有什么区别?它们在解决问题时有何异同?
- 区别:
- 工厂模式用于创建单个对象,它将对象的创建过程封装在一个工厂类中,客户端只需要关注工厂类即可获取所需的对象实例。
- 建造者模式用于创建复杂对象,将一个复杂对象的构建过程分解为多个简单的步骤,由具体的建造者类负责实现这些步骤,并通过指挥者来组织这些步骤的执行,最终构建出复杂对象。
- 异同:
- 相同点:都是创建型设计模式,都涉及对象的创建过程,都可以帮助解决对象的创建过程与客户端代码的解耦问题。
- 不同点:工厂模式关注于创建单个对象,而建造者模式关注于创建复杂对象,涉及对象构建过程的复杂性和组合方式。
6.12 工厂模式和单例模式之间有什么关系?它们之间有何联系?
- 工厂模式和单例模式是两种不同类型的设计模式,它们解决了不同的问题,没有直接的关系。
- 工厂模式是用于创建对象的一种模式,它可以帮助将对象的创建过程与客户端代码解耦。
- 单例模式是一种创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
6.13 在你之前的项目中是否使用过工厂模式?能否分享一些具体的应用经验?
- 是的,我在之前的项目中使用过工厂模式。一个具体的应用场景是在一个电商平台项目中,我们使用工厂模式来创建不同类型的支付方式对象。根据用户选择的支付方式(例如支付宝、微信、银行卡等),工厂类负责创建相应的支付对象,并将其提供给订单处理模块使用。
6.14 能够列举一些知名的框架或库中使用了工厂模式的例子吗?
- 一些知名的框架或库中使用了工厂模式,
- 例如 Java 中的 JDBC(Java Database Connectivity) API,它使用工厂模式来创建数据库连接对象;
- Spring Framework 中的 BeanFactory 和 ApplicationContext 使用工厂模式来创建和管理对象实例;
- Android 中的 LayoutInflater 使用工厂模式来创建 View 对象等。
6.15 工厂模式是如何符合设计原则的?它与哪些设计原则相关?
- 工厂模式符合开闭原则(Open Closed Principle)和单一职责原则(Single Responsibility Principle)。
- 工厂模式使得系统对扩展开放,对修改关闭,当需要添加新的产品时,只需要添加相应的具体产品类和对应的工厂类,而无需修改客户端代码。
- 工厂模式将对象的创建过程封装在一个单独的类中,实现了对象的创建和使用的分离,符合单一职责原则。
这些问题和答案可以帮助你更好地理解工厂模式,并在面试中给出清晰、准确的回答。
附录 demo
// 电脑接口
interface Computer {void display();
}// 具体产品类:台式电脑
class DesktopComputer implements Computer {@Overridepublic void display() {System.out.println("This is a desktop computer.");}
}// 具体产品类:笔记本电脑
class LaptopComputer implements Computer {@Overridepublic void display() {System.out.println("This is a laptop computer.");}
}// 抽象工厂类:电脑工厂
abstract class ComputerFactory {public abstract Computer createComputer();
}// 具体工厂类:台式电脑工厂
class DesktopComputerFactory extends ComputerFactory {@Overridepublic Computer createComputer() {return new DesktopComputer();}
}// 具体工厂类:笔记本电脑工厂
class LaptopComputerFactory extends ComputerFactory {@Overridepublic Computer createComputer() {return new LaptopComputer();}
}public class Main {public static void main(String[] args) {// 创建台式电脑ComputerFactory desktopFactory = new DesktopComputerFactory();Computer desktop = desktopFactory.createComputer();desktop.display();// 创建笔记本电脑ComputerFactory laptopFactory = new LaptopComputerFactory();Computer laptop = laptopFactory.createComputer();laptop.display();}
}
相关文章:

设计模式|工厂模式
文章目录 1. 工厂模式的三种实现2. 简单工厂模式和工厂方法模式示例3. 抽象工厂模式示例4. 工厂模式与多态的关系5. 工程模式与策略模式的关系6. 面试中可能遇到的问题6.1 **工厂模式的概念是什么?**6.2 **工厂模式解决了什么问题?**6.3 **工厂模式的优点…...

CHAT~(持续更新)
CHAT(持续更新) 实现一个ChatGPT创建API设计页面布局业务操作技术架构 实现安装工具 其他 实现一个ChatGPT 创建API 最简单也最需要信息的一步 继续往下做的前提 此处省略,想要获取接口创建方式联系 设计 页面布局 按照官网布局 业务操作…...

linux系统------------Mysql数据库介绍、编译安装
目录 一、数据库基本概念 1.1数据(Data) 1.2表 1.3数据库 1.4数据库管理系统(DBMS) 数据库管理系统DBMS原理 1.5数据库系统(DBS) 二、数据库发展史 1、第一代数据库 2、第二代数据库 3、第三代数据库 三、关系型数据库 3.1关系型数据库应用 3.2主流的…...

文件操作3
随机读写数据文件 一、随机读写原理 在我们写数据时,有一个光标不断的在随着新写入的数据往后移动; 而读数据时,也有一个看不见光标,随着已经读完的数据,往后移动 这里的文件读写位置标记——可以想象成图形界面里的…...
算法D57 | 动态规划17 | 647. 回文子串 516.最长回文子序列 动态规划总结篇
647. 回文子串 动态规划解决的经典题目,如果没接触过的话,别硬想 直接看题解。 代码随想录 Python: class Solution:def countSubstrings(self, s: str) -> int:n len(s)dp [[0]*n for _ in range(n)]dp[0] [1]*nresult nfor i in range(1, n)…...
go的限流
背景 服务请求下游,oom,排查下来发现是一个下游组件qps陡增导致 但是司内网络框架比较挫,竟然不负责框架内存问题(有内存管理模块,但逻辑又是无限制使用内存) 每个请求一个r、w buffer,请求无限…...

补充--广义表学习
第一章 逻辑结构 (1)A(),A是一个空表,长度为0,深度为1。 (2)B(d,e),B的元素全是原子,d和e,长度为2,深度为1。 (3)C(b,(c,…...
【笔记】KaiOS SPN显示逻辑
更新流程code 1、gonk/dom/system/gonk/radio/RadioInterfaceLayer.jsm handleNetworkStateChanged -> requestNetworkInfo() -> handleRilResponse的getOperator -> handleOperator handleNetworkStateChanged:网络状态变化请求网络信息 this.requestNetworkInfo…...

Visual Basic6.0零基础教学(4)—编码基础,数据类型与变量
编码基础,数据类型与变量 文章目录 编码基础,数据类型与变量前言一、VB中的编程基础二、VB的基本字符集和词汇集1、字符集2、词汇集 VB中的数据类型VB中的变量与常量一.变量和常量的命名规则二.变量声明1.用Dim语句显式声明变量三. 常量 运算符和表达式一. 运算符 1. 算术运算符…...

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准
文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…...
Android 图形渲染和显示系统关系
SurfaceFlinger:作为 Android 系统中的一个系统服务,SurfaceFlinger 负责管理整个屏幕的渲染和合成工作。它管理和合成多个 Surface,并与硬件加速器以及 Hardware Composer (HWC) 进行交互,最终将图像数据发送给显示硬件进行显示。…...
3.C++:类与对象(下)
一、再谈构造函数 1.1构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;i…...

iOS开发之SwiftUI
iOS开发之SwiftUI 在iOS开发中SwiftUI与Objective-C和Swift不同,它采用了声明式语法,相对而言SwiftUI声明式语法简化了界面开发过程,减少了代码量。 由于SwiftUI是Apple推出的界面开发框架,从iOS13开始引入,Apple使用…...

2024-简单点-pandas
pandas pandas to numpy 尽量不用.values提取数据 numexpr 和 bottleneck加速 布尔操作 describe 自定义describe .pipe df.apply 行或者列级别函数级别应用...

面试笔记——Redis(双写一致、持久化)
双写一致 双写一致性: 当修改了数据库中的数据,也要更新缓存的数据,使缓存和数据库中的数据保持一致。 相关问题:使用Redis作为缓存,mysql的数据如何与Redis进行同步?——双写一致性问题 回答时࿰…...

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞
漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…...

css的active事件在手机端不生效的解决方法
需求:需求就是实现点击图中的 “抽奖” 按钮,实现一个按钮Q弹的放大缩小动画 上面是实现的效果,pc端,点击触发 :active 问题:但是这种方式在模拟器上可以,真机H5一调试就没生效了,下面是简单…...

00. 认识 Java 语言与安装教程
认识 Java Java 在 20 多年发展过程中,与时俱进,为了适应时代的需要,经历过两次重大的版本升级,一个是 Java 5,它提供了泛型等重要的功能。另一个是提供了 Lambda 表达式等重要的功能的 Java 8。 一些重要的 Java 的…...
数据结构-栈-004
1链栈 1.1栈结点结构体定义 /*定义一个数据结构*/ typedef struct student {char name[32];char sex;int age; }DATA_TYPE;/*定义一个栈结点*/ typedef struct stack_node {DATA_TYPE data;//数据域struct stack_node *pnext;//指针域 }STACK_NODE;1.2栈顶结点结构体定义 /*…...
(第76天)XTTS 升级:11GR2 到 19C
参考文档: 11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 1389592.1)V4 使用跨平台增量备份减少可传输表空间的停机时间 (Doc ID 2940565.1)前言 XTTS(Cross Platform Transportable Tablespaces,跨平台迁移表空间)是…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...