5、(创建型设计模式)Java 工厂方法模式深度学习指南

Ubuntu24.04LTS上Ollama GPU加速配置指南:从驱动安装到多卡均衡负载 本文详细介绍了在Ubuntu24.04LTS系统上配置Ollama GPU加速的完整指南,包括NVIDIA驱动安装、CUDA Toolkit配置、Ollama在线与离线安装方法,以及多GPU负载均衡优化策略。通过实战案例和性能调优建议,帮助开发者充分利用硬件资源提升大型语言模型的运行效率。 阅读详情

以下是为你精心撰写的 《Java 工厂方法模式深度学习指南》,专为 Java 后端开发者设计,内容涵盖:定义、作用、真实业务场景、实现方式对比、Spring 中的体现、避坑指南、最佳实践、面试高频题,所有示例均含中文注释,可直接用于项目开发、重构与面试准备。


📘 Java 工厂方法模式深度学习指南

—— 从“new”到“工厂”的架构进化之路

作者:Java 后端架构实战导师
适用对象:Java 后端开发者(Spring Boot / 微服务 / 分布式系统)
目标:彻底理解工厂方法模式,摆脱“硬编码 new”,实现开闭原则和解耦设计
核心原则:“创建对象的责任,交给子类”


✅ 一、什么是工厂方法模式?

📌 定义:

工厂方法模式(Factory Method Pattern) 是一种创建型设计模式,它定义了一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让一个类的实例化延迟到其子类中进行。

🔍 核心思想:

  • 定义一个创建对象的抽象方法(工厂方法)
  • 由子类实现该方法,决定具体创建哪个类
  • 客户端只依赖抽象接口,不依赖具体实现

💡 一句话记忆:
“我要一个产品,但不关心你怎么造,你(子类)来决定造什么。”

🆚 对比简单工厂 vs 工厂方法:

模式简单工厂工厂方法
实现方式一个静态方法,用 if-else 判断抽象类定义工厂方法,子类重写
是否符合开闭原则❌ 新增产品需修改工厂代码✅ 新增产品只需新增子类,不改旧代码
扩展性差优秀
耦合度高(工厂类知道所有产品)低(客户端只依赖抽象)
推荐度仅用于简单场景✅ 推荐用于中大型系统

✅ 结论:工厂方法模式是“简单工厂”的升级版,是真正的面向对象设计!


✅ 二、工厂方法模式有什么作用?(Why Use Factory Method?)

作用说明
✅ 解耦对象创建与使用客户端无需知道具体类名,只调用接口
✅ 支持开闭原则(OCP)新增产品类型时,无需修改现有代码,只需新增子类
✅ 提高可扩展性易于支持多种产品变体(如不同支付方式、不同日志格式)
✅ 统一接口,规范行为所有产品实现同一接口,客户端行为一致
✅ 便于测试可轻松用 Mock 对象替换真实实现
✅ 支持依赖注入(DI)与 Spring 容器完美融合

💡 经典比喻:
你去餐厅点“汉堡”——你只说“我要一个汉堡”,
不关心是麦当劳的、肯德基的,还是本地小店的。
餐厅(工厂) 负责根据“菜单”决定做哪个。
→ 这就是工厂方法!


✅ 三、工厂方法模式的典型使用场景(Java 后端真实案例)

场景说明是否推荐使用工厂方法
✅ 支付方式支付宝、微信、银联、Apple Pay✅ 强烈推荐
✅ 日志输出控制台、文件、数据库、ELK✅ 推荐
✅ 消息发送短信、邮件、站内信、企业微信✅ 推荐
✅ 数据库驱动MySQL、PostgreSQL、Oracle✅ 推荐
✅ 序列化方式JSON、XML、Protobuf✅ 推荐
✅ 缓存实现Redis、Memcached、本地缓存✅ 推荐
✅ 文件读取器CSV、Excel、JSON 文件解析器✅ 推荐
❌ 工具类(如 StringUtils)无状态,静态方法即可❌ 不推荐
❌ 简单对象(如 User、Order)通常直接 new,无必要封装❌ 不推荐

✅ 判断标准:
“是否需要根据配置/环境/参数动态创建不同实现?”
→ 是 → 用工厂方法!


✅ 四、工厂方法模式的四种实现方式详解(含中文注释)

我们从基础结构到Spring 集成,逐步深入。


🔹 1. 基础结构:抽象产品 + 抽象工厂 + 具体产品 + 具体工厂

📌 步骤:
  1. 定义产品接口(抽象产品)
  2. 定义工厂接口(抽象工厂)
  3. 实现具体产品类
  4. 实现具体工厂类

✅ 示例:支付系统(支付宝、微信、银联)
/**
 * 【1】抽象产品:支付接口(所有支付方式的统一契约)
 */
interface Payment {
    boolean pay(double amount); // 支付方法
}

/**
 * 【2】具体产品1:支付宝支付实现
 */
class Alipay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("💳 支付宝支付成功,金额:" + amount + "元");
        return true;
    }
}

/**
 * 【3】具体产品2:微信支付实现
 */
class WeChatPay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("📱 微信支付成功,金额:" + amount + "元");
        return true;
    }
}

/**
 * 【4】抽象工厂:支付工厂接口(定义创建产品的抽象方法)
 */
interface PaymentFactory {
    Payment createPayment(); // 工厂方法:由子类决定创建哪个支付方式
}

/**
 * 【5】具体工厂1:支付宝工厂
 */
class AlipayFactory implements PaymentFactory {
    @Override
    public Payment createPayment() {
        return new Alipay(); // 创建支付宝对象
    }
}

/**
 * 【6】具体工厂2:微信工厂
 */
class WeChatPayFactory implements PaymentFactory {
    @Override
    public Payment createPayment() {
        return new WeChatPay(); // 创建微信支付对象
    }
}

/**
 * 【7】客户端:调用者(只依赖抽象,不关心具体实现)
 */
public class PaymentClient {
    public static void main(String[] args) {
        // 模拟从配置文件读取支付方式
        String paymentType = "alipay";

        PaymentFactory factory;
        if ("alipay".equals(paymentType)) {
            factory = new AlipayFactory(); // 创建具体工厂
        } else if ("wechat".equals(paymentType)) {
            factory = new WeChatPayFactory();
        } else {
            throw new IllegalArgumentException("不支持的支付方式");
        }

        // ✅ 客户端只调用抽象工厂和抽象产品
        Payment payment = factory.createPayment(); // 调用工厂方法
        payment.pay(199.9); // 执行支付
        // 输出:💳 支付宝支付成功,金额:199.9元
    }
}
✅ 优点:
  • 完全符合开闭原则:新增“银联支付”只需新增 UnionPay 和 UnionPayFactory,无需修改任何已有代码
  • 客户端解耦:客户端不知道具体类名,只依赖接口
  • 易于测试:可 Mock PaymentFactory 返回 MockPayment
💡 为什么叫“方法”?

因为“创建对象”是通过一个方法(createPayment())完成的,而不是通过 new 关键字。


🔹 2. 工厂方法 + 工厂注册表(Map + 反射)—— 更灵活的实现

避免在客户端写 if-else 判断,把选择权交给配置

import java.util.HashMap;
import java.util.Map;

/**
 * 【1】支付接口(同上)
 */
interface Payment {
    boolean pay(double amount);
}

class Alipay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("💳 支付宝支付成功,金额:" + amount + "元");
        return true;
    }
}

class WeChatPay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("📱 微信支付成功,金额:" + amount + "元");
        return true;
    }
}

/**
 * 【2】工厂注册表:使用 Map 存储工厂类名(避免硬编码)
 */
class PaymentFactoryRegistry {
    // 注册表:支付类型 -> 工厂类名
    private static final Map<String, Class<? extends PaymentFactory>> factoryMap = new HashMap<>();

    // 静态块:初始化注册表(可从配置文件读取)
    static {
        factoryMap.put("alipay", AlipayFactory.class);
        factoryMap.put("wechat", WeChatPayFactory.class);
    }

    /**
     * 根据支付类型获取工厂实例
     */
    public static PaymentFactory getFactory(String type) {
        try {
            Class<? extends PaymentFactory> factoryClass = factoryMap.get(type);
            if (factoryClass == null) {
                throw new IllegalArgumentException("未知支付类型:" + type);
            }
            return factoryClass.getDeclaredConstructor().newInstance(); // 反射创建
        } catch (Exception e) {
            throw new RuntimeException("创建工厂失败", e);
        }
    }
}

/**
 * 【3】抽象工厂接口(同上)
 */
interface PaymentFactory {
    Payment createPayment();
}

/**
 * 【4】具体工厂类(同上)
 */
class AlipayFactory implements PaymentFactory {
    @Override
    public Payment createPayment() {
        return new Alipay();
    }
}

class WeChatPayFactory implements PaymentFactory {
    @Override
    public Payment createPayment() {
        return new WeChatPay();
    }
}

/**
 * 【5】客户端:完全解耦,仅依赖配置
 */
public class RegistryFactoryDemo {
    public static void main(String[] args) {
        // 从配置文件或环境变量读取
        String paymentType = "alipay"; // 可从 application.yml 读取

        // ✅ 无需 if-else,通过注册表自动获取工厂
        PaymentFactory factory = PaymentFactoryRegistry.getFactory(paymentType);
        Payment payment = factory.createPayment();
        payment.pay(299.9);
        // 输出:💳 支付宝支付成功,金额:299.9元
    }
}
✅ 优点:
  • 新增支付方式:只需在 factoryMap 添加一行,无需修改客户端代码
  • 支持热加载:可从数据库或配置中心动态加载工厂类名
  • 真正符合开闭原则
⚠️ 注意:
  • 使用反射有性能开销,可缓存工厂实例
  • 非必要不推荐,适合大型可插拔系统

🔹 3. 工厂方法 + Spring 容器(最推荐的生产级写法)

在 Spring Boot 中,工厂方法模式是默认模式!

/**
 * 【1】支付接口(抽象产品)
 */
public interface Payment {
    boolean pay(double amount);
}

/**
 * 【2】具体产品1:支付宝支付
 */
@Component("alipay") // ✅ Spring 管理的 Bean,名称为 "alipay"
public class Alipay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("💳 支付宝支付成功,金额:" + amount + "元");
        return true;
    }
}

/**
 * 【3】具体产品2:微信支付
 */
@Component("wechat") // ✅ Spring 管理的 Bean,名称为 "wechat"
public class WeChatPay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("📱 微信支付成功,金额:" + amount + "元");
        return true;
    }
}

/**
 * 【4】工厂类:Spring 管理的工厂(使用 @Bean + @Qualifier)
 * 这是工厂方法模式在 Spring 中的优雅体现!
 */
@Configuration
public class PaymentFactoryConfig {

    // ✅ 工厂方法:根据参数返回不同 Bean
    @Bean
    public Payment createPayment(@Value("${payment.type:alipay}") String paymentType) {
        // Spring 自动注入所有 Payment 类型的 Bean
        // 通过 @Qualifier 按名称获取
        return switch (paymentType.toLowerCase()) {
            case "alipay" -> applicationContext.getBean("alipay", Payment.class);
            case "wechat" -> applicationContext.getBean("wechat", Payment.class);
            default -> throw new IllegalArgumentException("不支持的支付方式:" + paymentType);
        };
    }

    @Autowired
    private ApplicationContext applicationContext; // 注入 Spring 上下文
}

/**
 * 【5】服务层:使用工厂
 */
@Service
public class OrderService {

    @Autowired
    private Payment payment; // ✅ Spring 自动注入正确实现(由工厂方法决定)

    public void processOrder(double amount) {
        System.out.println("🛒 开始处理订单,金额:" + amount);
        boolean result = payment.pay(amount); // 调用支付
        if (result) {
            System.out.println("✅ 订单支付成功");
        }
    }
}

/**
 * 【6】配置文件:application.yml
 */
/*
payment:
  type: wechat  # 可改为 alipay,无需改代码!
*/

/**
 * 【7】启动类测试
 */
@SpringBootApplication
public class SpringFactoryDemo {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringFactoryDemo.class, args);
        OrderService orderService = context.getBean(OrderService.class);
        orderService.processOrder(188.8);
        // 输出:
        // 🛒 开始处理订单,金额:188.8
        // 📱 微信支付成功,金额:188.8元
        // ✅ 订单支付成功
    }
}
✅ 优点:
  • 完全解耦:客户端(OrderService)不知道具体实现
  • 配置驱动:通过 application.yml 动态切换支付方式
  • 无需手写工厂类:Spring 自动管理 Bean 生命周期
  • 支持 AOP、事务、缓存:所有 Spring 功能自动生效
💡 这是真正的“工厂方法模式”在企业级开发中的体现!

✅ 你每天都在用:

  • @Autowired JdbcTemplate
  • @Autowired MessageConverter
  • @Autowired TaskExecutor
    → 都是 Spring 工厂方法模式的体现!

🔹 4. 工厂方法 + 枚举 + 策略模式(企业级最佳实践)

将工厂方法与枚举结合,实现类型安全、零反射、易扩展

/**
 * 【1】支付接口
 */
interface Payment {
    boolean pay(double amount);
}

/**
 * 【2】具体实现
 */
class Alipay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("💳 支付宝支付成功,金额:" + amount + "元");
        return true;
    }
}

class WeChatPay implements Payment {
    @Override
    public boolean pay(double amount) {
        System.out.println("📱 微信支付成功,金额:" + amount + "元");
        return true;
    }
}

/**
 * 【3】支付方式枚举(核心:工厂方法嵌入枚举)
 * 每个枚举常量是一个“工厂”,返回对应支付实例
 */
public enum PaymentType {
    ALIPAY {
        @Override
        public Payment create() {
            return new Alipay();
        }
    },
    WECHAT {
        @Override
        public Payment create() {
            return new WeChatPay();
        }
    };

    // 抽象工厂方法:每个枚举实现自己的创建逻辑
    public abstract Payment create();

    // 静态方法:根据字符串获取枚举
    public static PaymentType fromString(String type) {
        for (PaymentType pt : values()) {
            if (pt.name().equalsIgnoreCase(type)) {
                return pt;
            }
        }
        throw new IllegalArgumentException("未知支付类型:" + type);
    }
}

/**
 * 【4】客户端:极简调用
 */
public class EnumFactoryDemo {
    public static void main(String[] args) {
        String paymentType = "alipay";
        Payment payment = PaymentType.fromString(paymentType).create(); // ✅ 一行创建
        payment.pay(99.9);
        // 输出:💳 支付宝支付成功,金额:99.9元
    }
}
✅ 优点:
  • 类型安全:编译期检查,避免拼写错误
  • 无反射:性能高
  • 防非法值:枚举值有限,不可伪造
  • 可序列化:枚举天然支持
  • 代码极简
💡 推荐场景:

支付、协议、状态、权限类型等有限且稳定的枚举场景


✅ 五、工厂方法模式的避坑指南(Java 后端高频踩坑)

问题原因解决方案
❌ 用 new 直接创建对象耦合严重,无法扩展✅ 改为通过工厂方法获取
❌ 工厂类中用 if-else 判断类型违反开闭原则✅ 用 Map + 配置 或 枚举
❌ 工厂类依赖具体实现类导致“工厂膨胀”✅ 所有产品实现同一接口
❌ 忘记使用抽象接口客户端依赖具体类✅ 所有变量声明为接口类型:Payment payment = factory.create();
❌ 在 Spring 中手写工厂而不用 @Bean重复造轮子✅ 优先用 Spring 容器管理
❌ 多线程下工厂创建对象不安全若对象有状态✅ 确保产品是无状态或线程安全的

✅ 六、工厂方法模式 vs 其他模式对比

模式区别适用场景
工厂方法抽象工厂定义方法,子类决定实现一个产品族,多个实现(如支付)
抽象工厂创建多个产品族(如 UI 主题 + 按钮+菜单)多套完整产品组合(如 Windows/Mac 主题)
简单工厂一个类包含所有创建逻辑小型项目,无扩展需求
建造者分步构建复杂对象构建有多个参数的对象(如 SQL、DTO)
策略模式算法可互换同一接口不同行为(如排序、折扣)

✅ 记住:
工厂方法 = “我需要一个产品,你来决定造哪个”
策略模式 = “我需要一个算法,你来决定用哪个”


✅ 七、学习建议与进阶路径

阶段建议
📚 第一周在你的项目中,把所有 new Alipay() 替换为 PaymentFactory.getPayment("alipay")
📚 第二周用 Spring 的 @Component + @Value 实现支付方式动态切换
📚 第三周用枚举工厂重构“日志输出方式”(控制台/文件/数据库)
📚 第四周阅读 Spring 源码:BeanFactory.getBean() 如何实现工厂方法?
📚 面试准备准备回答:

“你项目中哪里用了工厂方法?”
“Spring 中的 @Bean 是工厂方法吗?”
“工厂方法和策略模式区别?”
“为什么不用简单工厂?” |


✅ 八、总结:工厂方法模式选型决策树

graph TD
    A[需要创建不同对象吗?] --> B{对象类型是否有限且稳定?}
    B -->|是| C[使用枚举工厂(PaymentType.ALIPAY.create())]
    B -->|否| D{是否在 Spring 项目中?}
    D -->|是| E[使用 @Component + @Value + @Autowired,让 Spring 管理]
    D -->|否| F[使用抽象工厂接口 + 具体工厂类]
    G[是否需要热插拔?] --> H[使用 Map + 配置文件 + 反射]

✅ 最终推荐:

  • Spring 项目 → ✅ @Component + @Value(最优雅)
  • 非 Spring、类型固定 → ✅ 枚举工厂(最安全)
  • 非 Spring、需扩展 → ✅ 抽象工厂 + 具体工厂(最标准)
  • 绝对不要:简单工厂(if-else)、手写 new

✅ 九、工厂方法模式面试高频题(附答案)

Q1:什么是工厂方法模式?和简单工厂有什么区别?

A:工厂方法定义一个创建对象的接口,由子类决定实例化哪个类;简单工厂是一个类用 if-else 统一创建,违反开闭原则。

Q2:Spring 中的 @Bean 是工厂方法吗?

A:是的!@Bean 方法就是工厂方法,Spring 容器调用它来创建 Bean。

Q3:工厂方法模式如何实现开闭原则?

A:新增产品时,只需新增具体产品类和具体工厂类,无需修改客户端或抽象工厂代码。

Q4:工厂方法模式适合什么场景?

A:需要根据配置/环境创建不同实现的场景,如支付、日志、序列化、数据库驱动。

Q5:工厂方法模式和策略模式的区别?

A:

  • 工厂方法:创建对象(谁来造?)
  • 策略模式:执行行为(怎么干?)
    举例:工厂创建“支付宝”对象,策略决定“用支付宝支付”还是“用微信支付”。

✅ 十、结语:真正的高手,不写 new,而写 @Bean

你不是在学“工厂方法”,你是在学“如何让系统不因变化而崩溃”。

✅ 当你看到 @Autowired Payment payment 时,你已经站在了工厂方法的巅峰。
✅ 当你用 application.yml 切换支付方式而不改一行代码时,你已经掌握了开闭原则。

不要为了“用模式”而用模式,
要为了“系统可扩展、可维护、可配置”而选择它。


第1章 环境准备 本章是 Kubernetes 高可用集群部署的前置基础环境配置,所有节点必须严格按顺序执行。主要内容包括:节点规划(IP、角色、配置要求)、VMware 克隆节点环境清理(解决 MAC 地址和主机名冲突)、统一工作目录创建、主机名与 hosts 解析配置、系统基础升级、防火墙与 swap 关闭、内核模块加载(overlay、br_netfilter、ip_vs)、网络参数优化(IP 转发、桥接过滤)、时间同步配置等。Ubuntu 24.04 内核 6.8+ 原生支持 eBPF 和 IPVS,无需手动升级内核 阅读详情

相关推荐

python + QXDM5高通平台通过自动化截取log方法及代码

python + QXDM5高通平台通过自动化截取log方法及代码

dgzj2001的博客 1817

设置模式之--工厂方法模式 与 抽象工厂模式

设计模式之–工厂方法模式 与 抽象工厂模式 简介: 本篇文章是介绍 23 中设计模式中的 工厂方法模式 与 抽象工厂模式.使用的是 Java 代码. 目录: 1.什么是工厂模式 2.工厂模式的使用场景 3.简单工厂模式 4.工厂方法模式 5.抽象工厂模式 1.什么是工厂模式 定义: Factory Method(工厂模式):定义一个用于创建对象的接口, 让子类决定实例化哪个类. 工厂方法使一...

神经大条蕾弟的博客 346

西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践

本文详细解析了西门子OMAC PackML V2022在S7-1200/S7-1500中的状态机设计与应用实践。通过实际案例和代码示例,介绍了状态机的基础认知、硬件配置、逻辑开发、调试技巧以及与MES系统集成的高级应用,帮助工程师高效实现设备自动化控制。

weixin_29255731的博客 528

设计模式总结

设计模式是一门艺术 从出生元婴 二十加冕、三十而立 四十不惑、五十知天命 六十花甲、七十古稀不逾矩 设计模式来源于生活 GOF23种设计模式: 创建型:工厂方法模式、抽象工厂模式。建造者模式,原型模式 、单列模式 结构型:适配器模式、桥接模式、组合模式、装饰器模式、门面模式、代理模式 行为型:解释器模式、策略模式、观察者模式、命令模式。模板方法模式、责任链模式 装饰者和代理 策略和模板 代理和委派...

qq_34665775的博客 114

水电站数字孪生:水力发电在可视化领域的应用

为智慧水坝领域提供了 B/S 架构的基于 WebGL 的图形引擎,与 GIS、粒子仿真、虚拟现实、边缘计算等技术相结合,融合多元业务系统数据,形成数字孪生界面,助力水利水电工程进一步提升数字化水平,乃至为整个工业领域添砖加瓦。

二三维数据可视化/数字孪生 2255

清理异常值(MAD:绝对中位差)

清理异常数据: 中位数绝对偏差(MAD):用来描述单变量样本在定量数据中可变的一种标准 在统计学中,绝对中位差是刻画一元数据样本变化的一个鲁棒度量。由公式可以看出,其求解还算简单,给定一个数据样本集,首先求其中位数,然后求原始数据减去中位数的绝对值从而形成一个新的数据样本,再求新的数据样本的中位数即为绝对中位差。比如说有一个数据样本集X={2 3 8 7 9 6 4},这时候数据的中位数是6,原...

spider_man 1万+

JAVA设计模式类第一博主,用这份文档覆盖GOF研磨这23种设计模式(2)

由于关于设计的知识过于博大精深,因此本书“集中火力”,重点讲述GoF著作中涉及的23个设计模式本身,以及和这些设计模式相关的应用内容。本书的示例虽然大都来自实际应用,但是经过相当的删除简化和重新组合:另外一点,为了突出设计模式这个主题,因此代码并不是按照实际应用那样来严格要求,很多例外处理、数据检测等都没有做,逻辑也未见得那么严密:还有一点, 在实际的开发中,很可能是多个模式组合来实现某个功能,但是本书为了示例某个模式,让重点突出而避免读者迷惑,会选择重点示例某个模式的用法,而简化或去掉其他模式。

2401_84910888的博客 900

SPSS篇—卡方检验

今天依旧跟大家分享一个在SPSS中使用率比较高的分析方法:卡方检验。 在开始做分析之前,我们需要明白两件事情:卡方检验是什么?一般用来干什么?我们只有充分了解分析方法以后才能够正确的使用它。 卡方检验在百科中的解释是:卡方检验是用途非常广的一种假设检验方法,它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。它的原理是...

小白数据营的博客 20万+

视频教程-轻松搞懂设计模式-Java

轻松搞懂设计模式 计算机软件理论硕士毕业,有十几年企业研发经验和教育行业培训...

weixin_33231032的博客 335

手把手教你学Simulink--基于Simulink的开关磁阻电机电流斩波控制仿真建模

特点:定子和转子均由普通硅钢片叠压而成,没有永磁体或绕组在转子上。工作原理:利用转子旋转时不同位置的磁阻变化产生转矩。控制挑战:由于SRM的高度非线性和磁饱和效应,需要复杂的控制算法来优化性能。利用Simscape Electrical中的模块构建SRM的物理模型,配置参数如电阻、电感等。matlab深色版本% 添加SRM电机模块根据实际需求调整电机参数。通过上述步骤,我们简要介绍了如何基于Simulink进行开关磁阻电机的电流斩波控制仿真建模。

MHD0815的博客 304

软件设计师---计算机系统

软件设计师---计算机系统

我从不打没有准备的仗! 3万+

Spring介绍及设计模式

Spring----简化java开发 1.基于pojo的轻量级和最小侵入性编程 2.通过依赖注入和面向接口实现松耦合 3.基于切面和惯例进行声明式编程 4.通过切面和模板减少样板式代码Spring-----编程思想 1.OOP---Object Oriented Programming(面向对象编程),用程序总结生活中的一切事物 2.BOP---Bean Oriented Programming(面向Bean编程),面向Bean(普通的类)设计程序,解放程序员 3.AOP----Aspect Oriente

MOWRONG的博客 433

整理 钢琴 约翰·汤普森现代钢琴(大汤)

大汤

TS的博客 3991

2024年Android面试题之Java基础篇(2),如何才能通过一线互联网公司面试

现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。

2401_84538544的博客 798

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

2024年4月份我成功收获蚂蚁金服、阿里、拼多多等Offer 多亏这份“Java程序员P5—P8学习路线”

======服务注册发现API 网关配置中心事件调度(kafka)服务跟踪(starter-sleuth)服务熔断(Hystrix)Hystrix断路器机制API管理。

2401_84557547的博客 310

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Android 那些你不可错过的好书

《第一行代码》 如果你初窥Android,或者觉得你的基础还不够牢固,推荐你这本由 郭霖 大神著作的 《第一行代码》。 全书由浅入深、系统全面地讲解了Android软件开发的方方面面。第1章带领你搭建Android开发环境,完成你的第一个Android程序。第2章至第13章完整地讲解了Android开发中的各种基本知识和关键技术,包括四大组件、UI、碎片、广播机制、数据存储

u012426327的专栏 837

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蒲公英 · 积跬步以至千里

「蒲公英」期刊全新升级,更新频率由每月一次调整为每周一次。 全新的期刊,不仅精选优质的凹凸文章,与此同时,我们从团队专注的研究方向出发,每期挖掘「基础技术、工程化、跨端框架技术、图形编程、服务端开发、桌面开发、人工智能」7大方向的业界热点,并加以专业的解读。 抬头仰望,蒲公英的种子会生根发芽,如夏花绚烂;格物致知,我们登高远眺、沧海拾遗,以求积硅步而至千里。 登高远眺 天高地迥,觉宇宙之无穷...

凹凸实验室 1052

F3D:面向高性能工作流的模块化3D可视化引擎架构

F3D是一款专注于极致性能和模块化设计的开源3D可视化引擎,为技术决策者和架构师提供了从桌面应用到Web部署的全栈解决方案。区别于传统3D查看器的庞大单体架构,F3D采用插件化设计理念,通过libf3d核心库与可插拔格式解析器的解耦,实现了内存占用降低40%、启动时间小于500ms的技术突破,同时支持超过30种工业与科学数据格式的零拷贝加载。 ## 1. 创新定位与技术价值主张 F3D的技术定

gitblog_00532的博客 319

C++构建无人驾驶网约车平台:架构、核心模块与工程实践

自动驾驶系统作为实时性要求极高的复杂工程系统,其核心在于高性能计算与可靠通信。C++凭借其零开销抽象、精细内存控制及高效硬件交互能力,成为构建此类系统的首选语言。在工程实践中,系统通常采用分层分布式架构,通过模块化设计实现感知、规划、控制等核心功能的解耦与协同。其技术价值体现在能够处理高并发、低延迟的实时任务,例如多传感器数据融合、实时轨迹规划与车辆控制。应用场景广泛覆盖从仿真测试到实车部署的全流程。本文以无人驾驶网约车平台为例,深入剖析了基于C++和ROS2的系统集成方案,并针对高并发网络通信、实时轨迹规

weixin_30781775的博客 1203

软考——架构师笔记

该文章可作为系统架构设计师考试的参考笔记。

weixin_43930239的博客 696

Spring AI + GPT-5.5 + Ollama 配置教程:Base URL、超时与流式调用

由于不同 Spring AI、Spring Boot 小版本之间仍可能存在差异,创建项目时应检查 Spring Initializr、Spring AI BOM 和官方兼容矩阵,不要直接复制旧教程中的 Starter 名称和版本号。多人项目最好隔离不同客户端,并在脱敏前提下记录最终 URL、状态码、请求耗时、请求 ID 和模型 ID。Spring AI 接入模型 API,至少要同时确认 Starter、Base URL、请求路径、API Key、模型 ID、连接超时、读取超时和流式客户端这 8 项。

2601_95893075的博客 215

V8 机制、手写核心函数与 TypeScript 类型体操

或固定初始化(如数组先定长、对象先给全字段)保持类型与形状稳定;这些都比"换框架"更基础。只能处理纯数据(丢函数、Date、RegExp、循环引用报错)。生产级深拷贝要处理:原始值短路、循环引用、V8(Chrome / Node 的 JS 引擎)不是"解释一行跑一行"那么简单,它用。图:V8 执行流程——解释执行 + 热点优化,优化失败会 Deopt 回退。JS 内存自动管理,但"自动"不等于"不会漏"。是"固定间隔最多执行一次"。手写 Promise 是"懂异步"的试金石。是"停下后才执行最后一次",

qq_38468358的博客 325

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 140

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

Java EE 进阶:8.MyBatis 操作数据库(入门)(第一弹)

要努力去发光,而不是被照亮~ 112

Spring Boot 数据源与 MyBatis(-Plus) 自定义配置详解

本文详解 Spring Boot 中单数据源环境下 HikariCP 与 MyBatis-Plus 的自定义配置。通过手动声明 SqlSessionFactory,实现下划线转驼峰、日志输出、一级缓存策略等精细化控制。结合 HikariCP 核心参数调优(如最大连接数、连接生命周期),确保高性能与稳定性。适用于仅需访问单一数据库的场景,避免多数据源复杂性,兼顾性能与可维护性。

BADAO_LIUMANG_QIZHI的博客 190

LeetCode Hot 100 二叉树专题(二)3 题(Java)

本篇文章共 3 题:543. 二叉树的直径、102. 二叉树的层序遍历、108. 将有序数组转换为二叉搜索树。 每道题都统一按「① 题目分析 & 解题思路 → ② 常见解法(附代码)及讲解 → ③ 知识点总结」的顺序组织;代码使用 Java 编写,节点定义沿用 LeetCode 默认的 TreeNode。

2401_88612756的博客 352
上一篇: 4、(创建型设计模式)Java 单例模式深度学习指南
下一篇: 12、(行为型设计模式)Java 策略模式深度学习指南
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值