7、(创建型设计模式)Java 建造者模式深度学习指南

Java培训深度学习都要学什么   java的知识点有很多,如果是有java基础的同学,进行深度学习是非常有必要的,比较职场技能更新迭代非常的快,那么java培训深度学习都要学什么呢?来看看下面的详细介绍。   Java培训深度学习都要学什么?   Java深度学习要掌握两点:   第一个是基础。比如对集合类,并发包,类加载,IO/NIO,JVM,内存模型,泛型,异常,反射的学习掌握,在使用线程池时,因为使用了无界队列,在远程服务异常情况下导致内层飙升,怎么去解决?再举一例,由于对ThreadLocal理解出错,使用它做线程安全 阅读详情

以下是为你精心撰写的 《Java 建造者模式深度学习指南》,专为 Java 后端开发者打造,内容涵盖:定义、作用、真实业务场景、实现方式对比、Spring 集成、避坑指南、最佳实践、面试高频题,所有示例均含中文注释,可直接用于项目重构、DTO 构建、SQL 拼接、API 请求封装等复杂对象创建场景。


📘 Java 建造者模式深度学习指南

—— 从“构造函数爆炸”到“链式优雅构建”的架构升级

作者:Java 后端架构实战导师
适用对象:Java 后端开发者(Spring Boot / 微服务 / DTO / SQL / API 请求)
目标:彻底告别“10个参数的构造函数”和“setXXX() 泛滥”,掌握构建复杂对象的终极优雅方案
核心原则:“分步构建,链式调用,不可变对象,类型安全”


✅ 一、什么是建造者模式?

📌 定义:

建造者模式(Builder Pattern) 是一种创建型设计模式,它将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

🔍 核心思想:

  • 将对象的创建步骤(如设置属性)封装在独立的建造者类中
  • 使用链式调用(Fluent Interface)逐步设置属性
  • 最终通过 build() 方法返回一个不可变对象
  • 客户端无需关心构造细节,只需按需设置所需字段

💡 一句话记忆:
“我要一个复杂的对象,但不想一次性传10个参数——我一步一步来,最后交给你组装。”

🆚 对比传统方式 vs 建造者模式:

方式传统构造函数建造者模式
参数数量10+ 参数 → 构造函数爆炸只有一个 build()
可读性new User("张三", "13800138000", "北京", "男", 25, true, "工程师", "123@abc.com", "VIP", "2024-01-01")new User.Builder().name("张三").phone("138...").city("北京").build()
可选参数必须传所有参数,或写多个重载构造函数只设置需要的字段,其余默认
不可变性难以实现(需 setXXX)✅ 天然支持(final 字段)
扩展性新增字段需改所有构造函数只需在 Builder 中加一个方法
类型安全易错(参数顺序错乱)✅ 编译期检查,IDE 自动提示

✅ 经典比喻:
你去麦当劳点“巨无霸套餐”:

  • 传统方式:直接给收银员一长串清单:“我要汉堡、生菜、芝士、洋葱、酱料、薯条、可乐、纸巾、吸管……”
  • 建造者方式:
    1. 选汉堡
    2. 加生菜
    3. 加芝士
    4. 加酱料
    5. 加薯条
    6. 加可乐
    7. 点“完成”
      → 每一步清晰,可选可跳,最终一次性组装

✅ 二、建造者模式有什么作用?(Why Use Builder Pattern?)

作用说明
✅ 解决构造函数参数过多避免出现 User(String a, String b, String c, ..., boolean z) 的“参数地狱”
✅ 支持可选参数不强制传所有字段,只设置需要的,其余使用默认值
✅ 提高代码可读性builder.name("张三").age(25).email("xxx@xx.com").build() 清晰易懂
✅ 支持不可变对象(Immutable)build() 返回 final 字段对象,线程安全,无副作用
✅ 类型安全,防错IDE 自动提示可用方法,避免参数顺序错误
✅ 便于扩展新增字段只需在 Builder 中添加一个方法,不影响已有代码
✅ 支持链式调用(Fluent API)符合现代 Java 开发风格(如 Stream、Lombok、JPA)
✅ 适合复杂对象构建如 SQL、JSON、HTTP 请求、配置对象、POJO

💡 为什么 Java 标准库大量使用它?

  • StringBuilder
  • StringJoiner
  • java.time.LocalDateTime.Builder(Java 17+)
  • AlertDialog.Builder(Android)
    → 证明:建造者模式是构建复杂对象的黄金标准!

✅ 三、建造者模式的典型使用场景(Java 后端真实案例)

场景说明是否推荐使用建造者模式
✅ DTO / VO 对象接口返回/接收的复杂数据对象(含 5+ 字段)✅ 强烈推荐
✅ SQL 构建器拼接动态 WHERE 条件、ORDER BY、分页✅ 推荐
✅ HTTP 请求构造RestTemplate / FeignClient 请求体(含 Header、Body、Param)✅ 推荐
✅ 配置对象数据库连接配置、缓存策略、日志格式✅ 推荐
✅ JSON / XML 构建手动构造复杂 JSON 结构(避免用字符串拼接)✅ 推荐
✅ 消息体构建Kafka / RabbitMQ 消息内容(含元数据、业务体)✅ 推荐
✅ 测试数据构造单元测试中构造复杂对象(避免重复代码)✅ 推荐
❌ 简单 POJO(如 User 只有 name、age)字段少于 3 个❌ 用构造函数即可
❌ 工具类(如 StringUtils)无状态,静态方法❌ 不推荐
❌ 实体类(如 OrderItem)通常由 ORM 自动创建❌ 一般不需手动构建

✅ 判断标准:
“这个对象有 3 个以上字段,且其中部分是可选的、或构建过程复杂?”
→ 是 → 用建造者模式!


✅ 四、建造者模式的四种实现方式详解(含中文注释)

我们从手写经典版到Lombok 简化版,再到Java Record + Builder,逐步深入。


🔹 1. 手写经典建造者模式(推荐学习,面试必考)

/**
 * 【1】不可变实体类:订单信息(所有字段 final,线程安全)
 */
public class Order {
    private final String orderId;          // 订单ID(必填)
    private final String customerId;       // 客户ID(必填)
    private final String address;          // 收货地址(必填)
    private final double totalAmount;      // 总金额(必填)
    private final String paymentMethod;    // 支付方式(可选)
    private final String note;             // 备注(可选)
    private final String deliveryTime;     // 配送时间(可选)
    private final boolean isExpress;       // 是否加急(可选)

    // 私有构造函数:只能通过 Builder 创建
    private Order(Builder builder) {
        this.orderId = builder.orderId;
        this.customerId = builder.customerId;
        this.address = builder.address;
        this.totalAmount = builder.totalAmount;
        this.paymentMethod = builder.paymentMethod; // 可选
        this.note = builder.note;                   // 可选
        this.deliveryTime = builder.deliveryTime;   // 可选
        this.isExpress = builder.isExpress;         // 可选
    }

    // getter 方法(无 setter,保证不可变)
    public String getOrderId() { return orderId; }
    public String getCustomerId() { return customerId; }
    public String getAddress() { return address; }
    public double getTotalAmount() { return totalAmount; }
    public String getPaymentMethod() { return paymentMethod; }
    public String getNote() { return note; }
    public String getDeliveryTime() { return deliveryTime; }
    public boolean isExpress() { return isExpress; }

    // 【2】建造者内部类:所有字段的 setter 方法,返回 this 实现链式调用
    public static class Builder {
        private String orderId;          // 必填
        private String customerId;       // 必填
        private String address;          // 必填
        private double totalAmount;      // 必填
        private String paymentMethod;    // 可选
        private String note;             // 可选
        private String deliveryTime;     // 可选
        private boolean isExpress;       // 可选

        // 必填字段必须在构造时传入
        public Builder(String orderId, String customerId, String address, double totalAmount) {
            this.orderId = orderId;
            this.customerId = customerId;
            this.address = address;
            this.totalAmount = totalAmount;
        }

        // 可选字段:链式调用,返回 this
        public Builder paymentMethod(String paymentMethod) {
            this.paymentMethod = paymentMethod;
            return this; // 关键!支持链式调用
        }

        public Builder note(String note) {
            this.note = note;
            return this;
        }

        public Builder deliveryTime(String deliveryTime) {
            this.deliveryTime = deliveryTime;
            return this;
        }

        public Builder express(boolean isExpress) {
            this.isExpress = isExpress;
            return this;
        }

        // 【3】build() 方法:校验必填项,返回不可变对象
        public Order build() {
            // 校验必填字段
            if (orderId == null || orderId.trim().isEmpty()) {
                throw new IllegalArgumentException("订单ID不能为空");
            }
            if (customerId == null || customerId.trim().isEmpty()) {
                throw new IllegalArgumentException("客户ID不能为空");
            }
            if (address == null || address.trim().isEmpty()) {
                throw new IllegalArgumentException("收货地址不能为空");
            }
            if (totalAmount <= 0) {
                throw new IllegalArgumentException("总金额必须大于0");
            }

            // 创建并返回不可变对象
            return new Order(this);
        }
    }

    // 重写 toString,便于调试
    @Override
    public String toString() {
        return "Order{" +
                "orderId='" + orderId + '\'' +
                ", customerId='" + customerId + '\'' +
                ", address='" + address + '\'' +
                ", totalAmount=" + totalAmount +
                ", paymentMethod='" + paymentMethod + '\'' +
                ", note='" + note + '\'' +
                ", deliveryTime='" + deliveryTime + '\'' +
                ", isExpress=" + isExpress +
                '}';
    }
}

/**
 * 【4】客户端:使用建造者模式创建对象
 */
public class BuilderDemo {
    public static void main(String[] args) {
        // ✅ 链式调用,清晰、可读、可选字段自由组合
        Order order = new Order.Builder("ORD20240501001", "CUST10086", "北京市朝阳区XX路1号", 299.9)
                .paymentMethod("支付宝")         // 可选
                .note("请尽快发货,谢谢!")       // 可选
                .deliveryTime("2024-05-02 18:00") // 可选
                .express(true)                  // 可选
                .build();                       // 最终构建

        System.out.println(order);
        // 输出:
        // Order{orderId='ORD20240501001', customerId='CUST10086', address='北京市朝阳区XX路1号', totalAmount=299.9, paymentMethod='支付宝', note='请尽快发货,谢谢!', deliveryTime='2024-05-02 18:00', isExpress=true}

        // ✅ 如果不设置可选字段,也完全没问题
        Order simpleOrder = new Order.Builder("ORD002", "CUST999", "上海市浦东新区", 199.0)
                .build();
        System.out.println(simpleOrder);
        // 输出:Order{orderId='ORD002', customerId='CUST999', address='上海市浦东新区', totalAmount=199.0, paymentMethod='null', note='null', deliveryTime='null', isExpress=false}
    }
}
✅ 优点:
  • 完全不可变:线程安全,无副作用
  • 类型安全:编译期检查字段
  • 链式调用:代码优雅,可读性强
  • 必填校验:build() 中统一校验,防止脏数据
  • 扩展性好:新增字段只需在 Builder 中加一个方法
⚠️ 缺点:
  • 代码量多(需写 Builder 类)
  • 需手动维护 toString()、equals()、hashCode()

🔹 2. 建造者模式 + Lombok(企业级推荐写法)

使用 @Builder 注解,自动生成 Builder 类,大幅减少样板代码!

📦 引入依赖(Maven)
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version>
    <scope>provided</scope>
</dependency>
import lombok.Builder;
import lombok.Getter;
import lombok.ToString;

/**
 * 使用 Lombok 自动生成 Builder
 */
@Getter
@ToString
@Builder // ✅ 自动生成 Builder 类
public class Product {
    private final String productId;        // 必填
    private final String name;             // 必填
    private final double price;            // 必填
    private final String category;         // 可选
    private final String description;      // 可选
    private final boolean inStock;         // 可选,默认 true
    private final String supplier;         // 可选

    // 构造函数:Lombok 会自动生成全参构造(但不推荐直接使用)
    // 建议只通过 Builder 创建
}

/**
 * 客户端使用
 */
public class LombokBuilderDemo {
    public static void main(String[] args) {
        // ✅ 一行构建,Lombok 自动生成 Builder
        Product product = Product.builder()
                .productId("P001")
                .name("iPhone 15")
                .price(6999.0)
                .category("手机")
                .description("最新款苹果手机")
                .inStock(true)
                .supplier("苹果中国")
                .build();

        System.out.println(product);
        // 输出:Product(productId=P001, name=iPhone 15, price=6999.0, category=手机, description=最新款苹果手机, inStock=true, supplier=苹果中国)

        // ✅ 可选字段可跳过
        Product simple = Product.builder()
                .productId("P002")
                .name("充电器")
                .price(99.0)
                .build();

        System.out.println(simple);
        // 输出:Product(productId=P002, name=充电器, price=99.0, category=null, description=null, inStock=true, supplier=null)
    }
}
✅ 优点:
  • 代码极简:一行 @Builder 替代几十行 Builder 类
  • 自动维护:Lombok 自动生成 build()、builder()、setter 方法
  • 支持默认值:@Builder.Default 注解可设默认值
  • 与 Spring Boot 兼容:完美支持 JSON 序列化
⚠️ 注意事项:
  • 必须开启 Lombok 插件(IDEA:Settings → Plugins → Lombok)
  • 不支持校验逻辑:build() 中无法校验必填字段(需手动加 @NonNull 或 @Builder 配合校验)
  • 调试时看不到 Builder 源码(但 IDE 可跳转)
✅ 推荐写法(带默认值和校验):
import lombok.Builder;
import lombok.Getter;
import lombok.NonNull;
import lombok.ToString;

@Builder
@Getter
@ToString
public class User {
    @NonNull // Lombok 会自动生成非空校验
    private final String username;

    @NonNull
    private final String email;

    private final String phone;           // 可选

    @Builder.Default // 默认值
    private final boolean isActive = true;

    private final String role = "USER";   // 默认值
}

✅ 企业级建议:Spring Boot 项目优先使用 Lombok + @Builder


🔹 3. 建造者模式 + Java Record(Java 14+ 最新趋势)

Java 14+ 引入 record,天然支持不可变对象,搭配 @Builder 更优雅!

import lombok.Builder;

/**
 * Java Record:自动提供构造函数、getter、toString、equals、hashCode
 * 搭配 @Builder 自动生成建造者
 */
@Builder
public record OrderRecord(
    String orderId,           // 必填
    String customerId,        // 必填
    String address,           // 必填
    double totalAmount,       // 必填
    String paymentMethod,     // 可选
    String note,              // 可选
    String deliveryTime,      // 可选
    boolean isExpress         // 可选
) {
    // ✅ Record 自动提供:
    // - 全参构造函数
    // - 所有字段的 getter
    // - toString()
    // - equals() 和 hashCode()

    // 可添加校验逻辑(构造时校验)
    public OrderRecord {
        if (orderId == null || orderId.trim().isEmpty()) {
            throw new IllegalArgumentException("订单ID不能为空");
        }
        if (customerId == null || customerId.trim().isEmpty()) {
            throw new IllegalArgumentException("客户ID不能为空");
        }
        if (address == null || address.trim().isEmpty()) {
            throw new IllegalArgumentException("收货地址不能为空");
        }
        if (totalAmount <= 0) {
            throw new IllegalArgumentException("总金额必须大于0");
        }
    }
}

/**
 * 使用示例
 */
public class RecordBuilderDemo {
    public static void main(String[] args) {
        OrderRecord order = OrderRecord.builder()
                .orderId("ORD20240501")
                .customerId("CUST001")
                .address("北京市朝阳区")
                .totalAmount(199.9)
                .paymentMethod("微信支付")
                .isExpress(true)
                .build();

        System.out.println(order);
        // 输出:OrderRecord[orderId=ORD20240501, customerId=CUST001, address=北京市朝阳区, totalAmount=199.9, paymentMethod=微信支付, note=null, deliveryTime=null, isExpress=true]
    }
}
✅ 优点:
  • 最简洁:record + @Builder 一行搞定
  • 不可变:天然线程安全
  • 无 setter:杜绝状态污染
  • 编译器优化:性能优于传统类
⚠️ 缺点:
  • Java 14+ 才支持(需升级 JDK)
  • 不支持继承(record 是 final)
  • 不支持复杂逻辑(如字段间依赖校验)
💡 未来趋势:

Java 17+ 项目中,Record + @Builder 将成为构建不可变对象的首选!


🔹 4. 建造者模式 + SQL 构建器(真实业务场景)

用建造者模式构建动态 SQL,避免字符串拼接!

/**
 * SQL 构建器:动态拼接 WHERE 条件、ORDER BY、分页
 */
public class SqlBuilder {
    private StringBuilder select = new StringBuilder("SELECT * FROM ");
    private StringBuilder from = new StringBuilder();
    private StringBuilder where = new StringBuilder(" WHERE 1=1 "); // 防止空条件
    private StringBuilder orderBy = new StringBuilder();
    private int limit = -1;
    private int offset = 0;

    // 构造函数私有,只能通过静态方法创建
    private SqlBuilder() {}

    // 静态工厂方法:获取 Builder 实例
    public static SqlBuilder create() {
        return new SqlBuilder();
    }

    // 链式方法:构建 SQL
    public SqlBuilder from(String tableName) {
        this.from.append(tableName);
        return this;
    }

    public SqlBuilder where(String condition) {
        this.where.append(" AND ").append(condition);
        return this;
    }

    public SqlBuilder and(String condition) {
        return where(condition);
    }

    public SqlBuilder or(String condition) {
        this.where.append(" OR ").append(condition);
        return this;
    }

    public SqlBuilder orderBy(String field, String direction) {
        this.orderBy.append(" ORDER BY ").append(field).append(" ").append(direction);
        return this;
    }

    public SqlBuilder limit(int limit) {
        this.limit = limit;
        return this;
    }

    public SqlBuilder offset(int offset) {
        this.offset = offset;
        return this;
    }

    // 构建最终 SQL
    public String build() {
        StringBuilder sql = new StringBuilder();
        sql.append(select).append(from);

        if (where.length() > 0) {
            sql.append(where);
        }

        if (orderBy.length() > 0) {
            sql.append(orderBy);
        }

        if (limit > 0) {
            sql.append(" LIMIT ").append(limit);
            if (offset > 0) {
                sql.append(" OFFSET ").append(offset);
            }
        }

        return sql.toString();
    }
}

/**
 * 使用示例:动态查询用户订单
 */
public class SqlBuilderDemo {
    public static void main(String[] args) {
        String sql = SqlBuilder.create()
                .from("orders")
                .where("status = 'PAID'")
                .and("amount > 100")
                .or("user_id = 'U1001'")
                .orderBy("created_at", "DESC")
                .limit(10)
                .offset(0)
                .build();

        System.out.println(sql);
        // 输出:
        // SELECT * FROM orders WHERE 1=1 AND status = 'PAID' AND amount > 100 OR user_id = 'U1001' ORDER BY created_at DESC LIMIT 10 OFFSET 0

        // ✅ 灵活组合,无拼接混乱,无空指针,易测试
    }
}
✅ 优点:
  • 完全避免字符串拼接错误
  • 支持链式调用,逻辑清晰
  • 可复用、可测试、可缓存
  • 适用于 MyBatis、JDBC、JPA 原生 SQL

✅ 五、建造者模式的避坑指南(Java 后端高频踩坑)

问题原因解决方案
❌ 用 new 直接构造复杂对象参数多、易错、不可读✅ 改用 Builder
❌ Builder 中不校验必填字段导致脏数据入库✅ 在 build() 方法中校验,抛异常
❌ 忘记 return this链式调用失败✅ 每个 setter 方法必须返回 this
❌ 使用 Lombok 但未开启插件编译报错✅ IDEA 安装 Lombok 插件,开启 Annotation Processing
❌ 在 Builder 中修改对象状态破坏不可变性✅ Builder 是临时对象,build() 后不再使用
❌ 用 Builder 构建 Entity 实体与 JPA 冲突✅ 用 Builder 构建 DTO / VO,Entity 仍用 JPA 注解
❌ 所有字段都用 Builder小对象过度设计✅ 字段少于 3 个,用构造函数即可

✅ 六、建造者模式 vs 工厂方法 vs 策略模式 对比

模式目的关键词举例
工厂方法创建对象“谁来造?”PaymentFactory.create("alipay")
策略模式执行行为“怎么干?”discountStrategy.calculate(price)
建造者模式构建复杂对象“怎么组装?”Order.Builder().name(...).build()

✅ 组合使用:
你用工厂方法创建一个 OrderService,
用策略模式选择它的折扣算法,
用建造者模式构建 Order 对象
→ 三位一体,架构完美!


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

阶段建议
📚 第一周将你项目中所有“参数超过 4 个”的构造函数,重构为 Builder
📚 第二周用 Lombok 的 @Builder 替换手写 Builder,提升开发效率
📚 第三周用 Builder 重构一个 SQL 拼接工具类,避免字符串拼接
📚 第四周在 Spring Boot 项目中,用 record + @Builder 重构 DTO 层
📚 面试准备准备回答:

“你项目中哪里用了建造者模式?”
“Lombok 的 @Builder 是怎么实现的?”
“建造者模式和工厂方法区别?”
“为什么用 Builder 而不用 setXXX()?” |


✅ 八、建造者模式面试高频题(附答案)

Q1:建造者模式解决了什么问题?

A:解决了“构造函数参数过多”、“可选参数难处理”、“对象创建过程复杂”等问题,提供链式、可读、安全的构建方式。

Q2:Lombok 的 @Builder 是如何实现的?

A:Lombok 在编译期自动生成一个静态内部类 Builder,包含所有字段的 setter 方法和 build() 方法,返回原类实例。

Q3:建造者模式和 setXXX() 方法有什么区别?

A:

  • setXXX():对象可变,可能中途被修改,线程不安全
  • Builder:构建完成后返回不可变对象,线程安全,语义清晰

Q4:什么时候不该用建造者模式?

A:对象字段少于 3 个,或对象是简单 POJO,直接用构造函数更简洁。

Q5:Java Record 和 Builder 能一起用吗?

A:可以!record + @Builder 是 Java 17+ 的最佳实践,推荐用于 DTO 层。


✅ 九、总结:建造者模式选型决策树

graph TD
    A[需要构建复杂对象吗?] --> B{字段数量 > 3 且有可选参数?}
    B -->|是| C{是否使用 Java 17+?}
    C -->|是| D[使用 record + @Builder]
    C -->|否| E{是否使用 Lombok?}
    E -->|是| F[使用 @Builder]
    E -->|否| G[手写 Builder 类]
    B -->|否| H[直接使用构造函数]

✅ 最终推荐:

  • Java 17+ 项目 → ✅ record + @Builder(最现代)
  • Spring Boot 项目 → ✅ Lombok @Builder(最高效)
  • 无 Lombok、老项目 → ✅ 手写 Builder(最标准)
  • 绝对不要:10+ 参数构造函数、setXXX() 滥用、字符串拼接 SQL

✅ 十、结语:真正的高手,不写 new,而写 .builder().xxx().build()

你不是在学“建造者模式”,你是在学“如何优雅地管理复杂性”。

✅ 当你看到 Order.builder().userId("U1001").amount(99.9).build() 时,你已经拥有了架构师的思维。
✅ 当你用 Lombok 一键生成 50 个 DTO 的 Builder,团队开发效率提升 50% 时,你已经是团队的效率引擎。

不要为了“用模式”而用模式,
要为了“代码可读、可维护、可扩展”而选择它。


Java核心技术与设计模式深度学习 Java作为一种广泛使用的编程语言,在软件开发领域占据着举足轻重的地位。本章节旨在为读者提供一个关于Java基础知识的全面概览,为理解后续更高级的内容奠定坚实的基石。我们将从以下几个方面展开讨论:注解(Annotation)是Java中一种特殊的接口,提供了一种机制,使得开发者可以为代码元素(如类、方法、变量等)添加元数据。注解本身不会对代码的执行方式产生直接影响,但可以被编译器或者运行时工具读取,以执行相应的操作。注解的定义以@interface关键字开始,可以带有成员变量。 阅读详情

相关推荐

安装 Claude Code 并接入阿里云百炼(Bailian)

这些工具通常提供可视化界面,只需在设置中填入阿里云百炼的 API Key 和 Base URL 即可,无需配置环境变量。注意:如果你使用的是阿里云百炼的 Coding Plan 套餐,请使用该套餐专属的 API Key 和 Base URL。你可以使用文本编辑器打开该文件,或者在终端使用命令(如 macOS/Linux 下使用 nano ~/.claude/settings.json)。你可以直接用自然语言下达指令,例如:“帮我在这个目录下写一个 Python 脚本,实现两数之和的功能”。

hopsky的博客 1841

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

📘 Java 工厂方法模式深度学习指南(摘要) 本文系统讲解工厂方法模式在Java开发中的核心应用,涵盖定义、作用、典型场景及实现方式。工厂方法通过将对象创建延迟到子类,实现开闭原则和解耦设计,特别适用于支付系统、日志处理等多实现场景。指南详细对比了简单工厂与工厂方法的区别,提供四种实现方案(含Spring集成),重点演示了"支付系统"案例,展示如何通过抽象工厂+具体工厂实现灵活扩展。文中所有示例均含中文注释,可直接用于项目开发,帮助开发者避免硬编码,提升代码可维护性和可测试性。最后还

python15397的博客 676

STM32H743 ADC多通道采样实战:CubeMX配置+DMA传输避坑指南

本文详细介绍了STM32H743 ADC多通道采样的实战配置,包括CubeMX参数设置、DMA传输优化及常见问题解决方案。重点解析了ADC模块的核心特性、多通道采样序列配置、Cache一致性处理等关键技术,帮助开发者高效实现稳定可靠的模拟信号采集系统。

weixin_29175469的博客 611

6、(创建型设计模式)Java 抽象工厂模式深度学习指南

《Java抽象工厂模式深度学习指南》摘要 抽象工厂模式是一种创建型设计模式,用于创建一组相关或依赖对象(产品族)。与工厂方法模式相比,它更关注创建成套的协同工作对象,而非单个产品。核心优势包括:支持多环境配置(如开发/生产数据库切换)、保证产品一致性(避免MySQL连接配Oracle事务)、符合开闭原则。典型应用场景包括多数据库驱动、多租户系统、多UI主题等需要整体替换的场景。实现方式包含基础结构(抽象工厂接口+产品族)、枚举优化和Spring集成三种方案,其中Spring方案最推荐。关键设计原则是&quo

python15397的博客 987

aistudio高效解压zip文件的实用技巧

本文详细介绍了在百度AI Studio平台上高效解压ZIP文件的实用技巧。针对深度学习项目数据准备中的常见痛点,重点讲解了使用Python zipfile库和Linux unzip命令两种核心方法,并提供了路径设置、大文件处理、中文乱码等关键问题的解决方案,帮助用户提升数据处理效率。

salt的博客 783

【VAX 小番茄安装详细步骤】

本文详细介绍了在VS2022环境下安装Visual Assist X(番茄助手)的步骤及常见问题解决方案。主要内容包括:安装前的兼容性设置(需修改为Windows7兼容模式)、安装流程(卸载旧版本、勾选对应VS版本、替换关键dll文件)以及常见问题处理(如安装失败、工具栏图标缺失等)。文章提供了完整的下载链接和操作截图,特别强调了安装失败后的清理方法(注册表、安装目录和残余文件删除)。最后给出了安装成功后的测试运行指引。

qq_23962581的博客 1712

4、(创建型设计模式)Java 单例模式深度学习指南

《Java单例模式深度学习指南》摘要: 本文系统讲解单例模式的核心概念、作用及Java实现。单例模式确保类在JVM中唯一实例,提供全局访问点,适用于数据库连接池、配置管理等场景。详细分析五种实现方式: 饿汉式(线程安全但可能浪费资源) 懒汉式(线程不安全版,禁止使用) 同步方法懒汉式(线程安全但性能差) ... 包含完整代码示例(带中文注释),涵盖Spring单例作用域、线程安全解决方案(双重检查锁、静态内部类)、典型使用场景判断标准及面试高频问题。帮助开发者掌握单例模式的正确使用姿势,避免常见陷阱。

python15397的博客 856

深入解析进化算法中的选择与多样性

在计算科学的世界里,最优雅的解决方案往往源于最古老的智慧——大自然。进化算法(Evolutionary Algorithms, EAs)正是这样一种受达尔文自然选择学说启发的强大工具。它们通过模拟“适者生存”的过程,在庞大的可能性海洋中搜寻最优解。。:指的是深入挖掘和优化已知的优质解。这就像在一片已知的沃土上精耕细作,力求获得最高产量。强大的选择压力会促进这一过程。:指的是在整个搜索空间中寻找全新的、可能更优的解。这好比派遣探险队去发现新大陆,充满了未知与机遇。保持种群的多样性是探索的关键。

weixin_62533513的博客 713

12、(行为型设计模式)Java 策略模式深度学习指南

《Java策略模式深度学习指南》摘要: 本文专为Java后端开发者设计,系统讲解策略模式从原理到落地的全流程。核心围绕消除if-else嵌套,实现运行时动态切换算法。内容包含:策略模式定义(行为型设计模式)、四大优势(解耦/扩展/测试/复用)、九大典型应用场景(折扣计算/支付路由等),并通过完整代码演示基础实现到Spring集成方案。特别提供四种实现方式对比(含上下文管理、枚举策略、函数式接口等),配套中文注释示例可直接用于项目重构。最后附有SpringBoot集成方案和六大避坑指南,帮助开发者掌握这一&q

python15397的博客 780

从实验室到生产线:Qwen3-Omni后训练技术在实际业务中的落地挑战

本文探讨了Qwen3-Omni后训练技术在实际业务中的落地挑战,重点分析了多模态AI在工业应用中的关键问题与解决方案。通过金融风控、跨境电商等场景案例,揭示了通用模型与垂直需求的矛盾,并提供了知识蒸馏、语音合成优化等实战经验,助力企业实现技术到业务的转化。

weixin_29035147的博客 265

大模型——CoPaw:阿里云通义推出的个人智能体工作台,让 AI 助理真正落地

阿里云通义实验室于2026年2月发布CoPaw个人智能助理,采用"本地+云端"双部署模式,支持多平台接入和技能扩展。该产品基于AgentScope多智能体生态构建,具备极简部署、长期记忆系统和灵活的技能插件体系三大核心特性。用户可通过简单命令快速安装,并通过记忆文件系统实现个性化交互体验。CoPaw还支持钉钉、飞书等主流平台接入,并开源了模块化架构,允许本地模型接入。技术架构采用多频道对话网关与可插拔Skills系统,为用户提供真正的AI助理服务体验。

2129

java设计模式深度理解分析

java23种设计模式 创建型模式 单例模式 抽象工厂模式 原型模式 建造者模式 工厂模式 结构性模式 结构性模式 适配器模式 桥接模式 装饰模式 组合模式 外观模式 享元模式 代理模式 行为型模式 模板方法模式 命令模式 访问者模式 迭代器模式 观察者模式 中介者模式 备忘录模式 解释器模式 状态模式 10.策略模式 11.责任链模式 ...

qq_43917601的博客 1275

【CanMV K210】AI 视觉 MNIST 手写数字识别与分类推理

本文介绍了基于CanMV K210开发板的MNIST手写数字识别实验。实验通过摄像头采集图像,经过开窗、灰度化、缩放、反色等预处理后,使用KPU神经网络加速器运行MNIST分类模型,最终在LCD上显示识别结果。重点讲解了分类模型与检测模型的区别、图像预处理流程以及KPU推理结果的解析方法。实验帮助理解从图像采集到分类输出的完整AI视觉处理链路,并提供了调试思路和硬件连接说明。

Mr数据杨 364

17、(行为型设计模式)Java 状态模式深度学习指南

《Java 状态模式深度学习指南》摘要 本文系统讲解状态模式在Java开发中的应用,帮助开发者摆脱if-else状态判断困境。核心要点: 定义:允许对象在内部状态改变时自动切换行为,将状态封装为独立类 作用:消除条件判断、支持开闭原则、提高可维护性,特别适合订单系统、审批流程等场景 实现方式: 基础结构(状态接口+具体状态类+上下文) 结合Spring框架 集成状态机引擎 典型场景:订单状态流转、审批流程、工单系统等具有明确状态转换规则的业务 最佳实践:状态转换由状态类自身控制,避免外部逻辑判断 文含完整代

python15397的博客 753

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

16、(行为型设计模式)Java 命令模式深度学习指南

Java命令模式深度学习指南摘要 本文深入探讨Java命令模式,专为后端开发者设计,涵盖定义、作用、与策略模式对比、应用场景及实现方式。命令模式通过封装请求为对象,实现操作参数化、排队、撤销和日志记录,适用于订单回滚、审计日志、任务队列等场景。文章详细解析经典实现(命令/调用者/接收者)、Spring Task和Kafka集成,并提供撤销/重做功能实现方案。同时包含避坑指南、最佳实践和面试常问题目,所有代码示例均含中文注释。核心价值在于解耦请求发送与执行,支持异步处理、操作回滚和系统审计,是构建健壮后端系统

python15397的博客 756

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

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

10、(结构型设计模式)Java 代理模式深度学习指南

《Java 代理模式深度学习指南》摘要 代理模式是Java后端开发中控制对象访问的核心设计模式,通过代理对象在不修改原对象的前提下实现权限校验、日志记录、事务管理等增强逻辑。指南详细对比了代理与装饰器模式的本质区别(控制访问 vs 功能增强),并列举了权限控制、远程调用、AOP实现等8大典型应用场景。内容涵盖静态代理、JDK动态代理和CGLIB代理三种实现方式,提供中文注释示例代码,特别解析了Spring AOP的代理机制。最后给出生产环境避坑建议和面试高频题,帮助开发者掌握"代理即哨兵&quot

python15397的博客 658

VB摄像头监控

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

13、(行为型设计模式)Java 模板方法模式深度学习指南

《Java模板方法模式深度学习指南》摘要: 本文深入讲解Java模板方法模式,适合后端开发者处理订单流程、审批流等业务场景。该模式通过定义算法骨架(父类)和可重写步骤(子类),实现"固定流程,灵活实现"的架构设计。文章对比了模板方法与策略模式的区别,分析了适用场景(如订单处理、数据导入等),并提供了三种实现方式:基础抽象类、Spring集成和Lambda表达式。指南包含中文注释示例,涵盖核心思想、作用、最佳实践及面试高频题,帮助开发者避免代码重复、强制流程规范,提高可维护性。关键区别在于

python15397的博客 944

11、(结构型设计模式)Java 外观模式深度学习指南

《Java外观模式深度学习指南》摘要: 外观模式是一种结构型设计模式,通过统一接口封装多个子系统调用,降低复杂度。核心价值在于:1)简化客户端调用(如订单系统只需调用placeOrder());2)解耦客户端与子系统;3)支持微服务聚合/API网关等场景。与适配器模式不同,外观模式旨在简化而非兼容接口。典型实现包含子系统类(库存、支付等)和外观类(协调调用顺序与异常处理)。适用于多服务协同场景(如用户注册需调用5+服务),但单一服务调用不建议使用。Spring项目中可通过@FacadeService注解集成

python15397的博客 966

15、(行为型设计模式)Java 责任链模式深度学习指南

《Java责任链模式核心摘要》 模式本质:解耦请求与处理,允许多对象按链式顺序处理请求,适用于权限校验、日志拦截、API网关等场景。 核心优势: ✅ 消除嵌套if-else ✅ 动态扩展处理器 ✅ 灵活调整执行顺序 ✅ 支持处理中断(如黑名单拦截) 典型实现对比: 手写经典版:定义处理器接口+抽象类,通过setNext()构建链 Spring集成: Filter:适合HTTP请求预处理(编码/CORS) AOP:基于注解实现业务逻辑拦截 Spring Gateway:内置过滤器链(路由/限流) 避坑指南:

python15397的博客 680

9、(结构型设计模式)Java 装饰器模式深度学习指南

《Java 装饰器模式深度学习指南》摘要 装饰器模式是一种动态扩展对象功能的结构型设计模式,通过组合而非继承实现功能叠加,符合开闭原则。核心思想是包装原始对象,在方法调用前后添加增强逻辑(如日志、缓存、加密等)。 ✅ 优势: 避免继承导致的类爆炸 支持运行时动态组合功能 每个装饰器专注单一职责 🔥 典型场景:日志增强、缓存注入、权限校验等。实现时需定义统一接口,装饰器持有被装饰对象引用,通过嵌套调用实现功能叠加。文中提供完整代码示例(含中文注释),展示如何组合日志、缓存、加密装饰器。 🌟 核心价值:用&

python15397的博客 797

14、(行为型设计模式)Java 观察者模式深度学习指南

《Java 观察者模式深度学习指南》摘要 本文系统讲解 Java 观察者模式,涵盖核心概念、应用场景及三种实现方式(JDK 原生、Spring 事件、响应式编程)。观察者模式通过松耦合的一对多依赖关系,实现状态变更自动通知,显著优于轮询机制。典型应用场景包括订单通知、缓存更新、系统监控等异步解耦需求。 重点内容: 对比轮询与观察者模式,突出后者在效率、实时性上的优势 详解三种实现: JDK Observable(已过时,仅作原理学习) Spring 事件机制(生产推荐) Reactive 响应式编程(现代方

python15397的博客 1064

三、建造者模式——麦当劳的配餐服务

建造者模式就像一位厨师,在你点餐的时候会给你搭配薯条和番茄酱,给你炸鸡和啤酒,然后不断的放在你的餐盘上,最后送到你面前。

EndlessProcess的专栏 531

8、(结构型设计模式)Java 适配器模式深度学习指南

📘 Java适配器模式精华摘要 适配器模式是一种结构型设计模式,用于解决接口不兼容问题。通过将一个类的接口转换为客户端期望的接口,使原本无法协同工作的类能够一起工作。 🔍 核心价值: ✅ 兼容第三方库(如支付/短信SDK) ✅ 适配遗留系统(新旧接口转换) ✅ 统一接口规范(多服务标准对接) ✅ 避免源码修改(保护现有系统) 🛠️ 两种实现方式: 对象适配器(推荐):通过组合方式持有被适配对象 类适配器(Java单继承限制) ⚡ 典型场景: 支付系统(微信/支付宝接口统一) 日志框架迁移(Log4j→

python15397的博客 918

java插件开发模式_DL插件开发笔记

DL的插件和宿主有三种开发模式,我们这里讨论的是DL插件和宿主程序完全独立的开发模式,至于其余两种,可以到官网了解。CodeBox客户端就是一个宿主程序,开发插件的同学可以完全不去管宿主是如何开发的。这篇文章也是专门讨论插件的开发。DL插件开发其实非常简单,只需要修改三个地方。主题dl的插件必须每个activity都单独设置主题(插件的作者说的是也可以在application上设置主题),但我实际...

weixin_31458015的博客 554

各类设计模式对比与Spring设计模式的总结

分类 设计模式 创建型 工厂方法模式(Factory Method)、抽象工厂模式(Abstract Factory)、建造者模式(Builder)、原型模式(Prototype)、单例模式(Singleton) 结构型 适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰器模式...

yakax的博客 289

设计模式总结

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

qq_34665775的博客 114
上一篇: 17、(行为型设计模式)Java 状态模式深度学习指南
下一篇: 6、(创建型设计模式)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、付费专栏及课程。

余额充值