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

用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6 @用Proteus8.9自带STM32F401VE的Controller仿真STM32F407ZGT6,F429IGT6 一, 目前得到的 Proteus8.9版本软件能够支持的Cortex-M4固件库项目,只能到达STM32F401VE (如下图1所示)。 (图1) 作为ST公司Cortex-M4更为广泛应用的F407,F429系列芯片;现在的Proteus8.9版本软件还没有固件库支持,不能... 阅读详情

以下是为你精心撰写的 《Java 抽象工厂模式深度学习指南》,专为 Java 后端开发者打造,内容涵盖:定义、作用、与工厂方法模式的深度对比、真实业务场景、实现方式、Spring 集成、避坑指南、最佳实践、面试高频题,所有示例均含中文注释,可直接用于项目重构、多环境配置、多数据库驱动、多租户系统等复杂架构设计。


📘 Java 抽象工厂模式深度学习指南

—— 从“单一产品族”到“多套完整解决方案”的架构跃迁

作者:Java 后端架构实战导师
适用对象:Java 后端开发者(Spring Boot / 微服务 / 多租户 / 多数据库 / 企业级系统)
目标:彻底理解“产品族”概念,掌握一次性创建一组相关或依赖对象的终极工厂模式
核心原则:“我要一套完整的解决方案,不是单个零件,而是成套的、能协同工作的整体”


✅ 一、什么是抽象工厂模式?

📌 定义:

抽象工厂模式(Abstract Factory Pattern) 是一种创建型设计模式,它提供一个接口,用于创建一系列相关或相互依赖的对象,而无需指定它们具体的类。

🔍 核心思想:

  • 不止创建一个对象,而是创建一组对象(产品族)
  • 每个“产品族”中的对象必须协同工作(如:MySQL + MySQLTransaction)
  • 客户端只依赖抽象接口,不依赖具体实现
  • 通过一个工厂接口,统一创建多个相关产品

💡 一句话记忆:
“我不是要一个按钮,我要一套完整的 Windows 主题:按钮、菜单、窗口、图标,它们要风格一致。”

🆚 对比:工厂方法 vs 抽象工厂

维度工厂方法模式抽象工厂模式
创建对象数量一次创建一个对象一次创建一组对象(产品族)
关注点“怎么创建一个支付方式?”“怎么创建一套完整的数据库系统?”
接口数量一个工厂接口(PaymentFactory)一个抽象工厂接口 + 多个产品接口
扩展维度扩展产品类型(新增支付宝)扩展产品族(新增 PostgreSQL 系统)
典型场景单一产品变体多套完整配置/风格/环境
客户端依赖依赖一个工厂依赖一个抽象工厂,创建多个产品

✅ 举个生活例子:
你去装修房子:

  • 工厂方法:你问“给我一个门”,工厂给你一扇实木门或防盗门
  • 抽象工厂:你问“给我一套北欧风格装修”,工厂给你:北欧门 + 北欧灯 + 北欧地板 + 北欧沙发 —— 风格统一、配套使用

✅ 二、抽象工厂模式有什么作用?(Why Use Abstract Factory?)

作用说明
✅ 创建产品族一次性创建一组相互依赖、风格一致的对象
✅ 隔离产品族的实现客户端无需知道具体类,只通过抽象接口操作
✅ 支持多环境/多租户如:开发环境用 H2,生产环境用 MySQL,测试环境用 Oracle,整套配置统一切换
✅ 符合开闭原则新增一个产品族(如 PostgreSQL 系统),无需修改客户端代码
✅ 提高系统一致性避免出现“MySQL 连接 + Oracle 事务”的错误组合
✅ 支持热插拔配置通过配置文件切换整套实现,无需改代码
✅ 降低耦合度客户端与具体产品实现完全解耦

💡 经典名言:
“When you need to create families of related or dependent objects, use the Abstract Factory pattern.”
——《Design Patterns: Elements of Reusable Object-Oriented Software》


✅ 三、抽象工厂模式与工厂方法模式的深度对比

对比维度工厂方法模式抽象工厂模式
核心目的创建一个对象创建一组对象(产品族)
结构复杂度简单:一个工厂 + 一个产品复杂:一个抽象工厂 + 多个产品接口 + 多个具体工厂
扩展方式新增一个产品类 + 一个工厂类新增一个产品族(多个产品类 + 一个工厂类)
客户端调用factory.createProduct()factory.createProductA(); factory.createProductB();
典型场景支付方式(支付宝/微信)数据库系统(MySQL + MySQLTransaction)
依赖关系产品之间无依赖产品之间强依赖、必须配套
是否适合多环境❌ 仅适合单一产品变体✅ 完美支持多环境/多租户

✅ 关键区别图示:

工厂方法:
PaymentFactory → Alipay
PaymentFactory → WeChatPay

抽象工厂:
DatabaseFactory → MySQLFactory(创建 MySQLConnection + MySQLTransaction)
DatabaseFactory → PostgreSQLFactory(创建 PostgreSQLConnection + PostgreSQLTransaction)

⚠️ 重要结论:
如果产品之间是“独立的” → 用工厂方法
如果产品之间是“配套的” → 用抽象工厂


✅ 四、抽象工厂模式的典型使用场景(Java 后端真实案例)

场景说明是否推荐使用抽象工厂模式
✅ 多数据库驱动系统MySQL、PostgreSQL、Oracle 的连接 + 事务 + SQL 解析器✅ 强烈推荐
✅ 多租户 SaaS 系统不同租户使用不同缓存(Redis vs Memcached)、不同日志系统(ELK vs 文件)✅ 推荐
✅ 多 UI 主题Windows 主题、Mac 主题、暗黑模式(按钮、菜单、窗口)✅ 推荐
✅ 多消息队列适配RabbitMQ + Kafka + RocketMQ 的连接、序列化、重试策略✅ 推荐
✅ 多序列化方式JSON + Protobuf + Hessian 的编码器、解码器、注册器✅ 推荐
✅ 多缓存策略本地缓存(Caffeine) + Redis + 多级缓存组合✅ 推荐
✅ 多安全认证JWT + OAuth2 + LDAP 的 Token 生成器、校验器、刷新器✅ 推荐
❌ 单一支付方式只有支付宝、微信,无配套事务/日志❌ 用工厂方法即可
❌ 简单配置对象只有一个 DataSource❌ 用 Spring @Bean 即可

✅ 判断标准:
“我需要同时创建多个对象,它们必须是同一套、风格一致、协同工作的?”
→ 是 → 用抽象工厂模式!


✅ 五、抽象工厂模式的三种实现方式详解(含中文注释)

我们从基础结构到Spring 自动装配,逐步深入。


🔹 1. 基础结构:抽象工厂 + 产品族(经典实现)

/**
 * 【1】产品族1:数据库连接接口
 */
interface Connection {
    void connect(); // 连接数据库
}

/**
 * 【2】产品族2:数据库事务接口
 */
interface Transaction {
    void begin();   // 开始事务
    void commit();  // 提交事务
    void rollback(); // 回滚事务
}

/**
 * 【3】具体产品1:MySQL 连接
 */
class MySQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 MySQL: 成功连接到 MySQL 数据库");
    }
}

/**
 * 【4】具体产品2:MySQL 事务
 */
class MySQLTransaction implements Transaction {
    @Override
    public void begin() {
        System.out.println("🔄 MySQL: 开始事务");
    }

    @Override
    public void commit() {
        System.out.println("✅ MySQL: 提交事务");
    }

    @Override
    public void rollback() {
        System.out.println("❌ MySQL: 回滚事务");
    }
}

/**
 * 【5】具体产品3:PostgreSQL 连接
 */
class PostgreSQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 PostgreSQL: 成功连接到 PostgreSQL 数据库");
    }
}

/**
 * 【6】具体产品4:PostgreSQL 事务
 */
class PostgreSQLTransaction implements Transaction {
    @Override
    public void begin() {
        System.out.println("🔄 PostgreSQL: 开始事务");
    }

    @Override
    public void commit() {
        System.out.println("✅ PostgreSQL: 提交事务");
    }

    @Override
    public void rollback() {
        System.out.println("❌ PostgreSQL: 回滚事务");
    }
}

/**
 * 【7】抽象工厂接口:定义创建产品族的方法
 */
interface DatabaseFactory {
    Connection createConnection(); // 创建连接
    Transaction createTransaction(); // 创建事务
}

/**
 * 【8】具体工厂1:MySQL 工厂
 */
class MySQLFactory implements DatabaseFactory {
    @Override
    public Connection createConnection() {
        return new MySQLConnection(); // 创建 MySQL 连接
    }

    @Override
    public Transaction createTransaction() {
        return new MySQLTransaction(); // 创建 MySQL 事务
    }
}

/**
 * 【9】具体工厂2:PostgreSQL 工厂
 */
class PostgreSQLFactory implements DatabaseFactory {
    @Override
    public Connection createConnection() {
        return new PostgreSQLConnection(); // 创建 PostgreSQL 连接
    }

    @Override
    public Transaction createTransaction() {
        return new PostgreSQLTransaction(); // 创建 PostgreSQL 事务
    }
}

/**
 * 【10】客户端:使用抽象工厂创建整套产品族
 */
public class AbstractFactoryDemo {
    public static void main(String[] args) {
        // 模拟从配置文件读取数据库类型
        String dbType = "mysql"; // 可改为 "postgresql"

        DatabaseFactory factory;
        if ("mysql".equals(dbType)) {
            factory = new MySQLFactory(); // 创建 MySQL 产品族
        } else if ("postgresql".equals(dbType)) {
            factory = new PostgreSQLFactory(); // 创建 PostgreSQL 产品族
        } else {
            throw new IllegalArgumentException("不支持的数据库类型");
        }

        // ✅ 客户端只依赖抽象接口,无需知道具体实现
        Connection conn = factory.createConnection(); // 创建连接
        Transaction tx = factory.createTransaction(); // 创建事务

        // 使用产品族:它们是“配套”的
        conn.connect(); // 连接数据库
        tx.begin();     // 开始事务
        tx.commit();    // 提交事务
        // 输出:
        // 🔌 MySQL: 成功连接到 MySQL 数据库
        // 🔄 MySQL: 开始事务
        // ✅ MySQL: 提交事务

        // ✅ 如果切换为 PostgreSQL,只需改一行代码,其余逻辑完全不变!
    }
}
✅ 优点:
  • 产品族强一致性:MySQL 连接只能搭配 MySQL 事务,杜绝错配
  • 客户端完全解耦:不依赖具体类,只依赖抽象
  • 扩展性极佳:新增 Oracle 产品族,只需新增 OracleFactory,无需改客户端
  • 符合开闭原则
⚠️ 缺点:
  • 每新增一个产品族,需新增一个工厂类
  • 代码量大,结构复杂

🔹 2. 抽象工厂模式 + Spring 容器(企业级推荐写法)

在 Spring 中,每个 Bean 就是一个产品,每个配置类就是一个工厂!

/**
 * 【1】产品接口(同上)
 */
interface Connection {
    void connect();
}

interface Transaction {
    void begin();
    void commit();
    void rollback();
}

/**
 * 【2】具体产品:MySQL 实现
 */
@Component("mysqlConnection") // 注册为 Bean,名称为 mysqlConnection
class MySQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 MySQL: 成功连接到 MySQL 数据库");
    }
}

@Component("mysqlTransaction")
class MySQLTransaction implements Transaction {
    @Override
    public void begin() {
        System.out.println("🔄 MySQL: 开始事务");
    }

    @Override
    public void commit() {
        System.out.println("✅ MySQL: 提交事务");
    }

    @Override
    public void rollback() {
        System.out.println("❌ MySQL: 回滚事务");
    }
}

/**
 * 【3】具体产品:PostgreSQL 实现
 */
@Component("postgresqlConnection")
class PostgreSQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 PostgreSQL: 成功连接到 PostgreSQL 数据库");
    }
}

@Component("postgresqlTransaction")
class PostgreSQLTransaction implements Transaction {
    @Override
    public void begin() {
        System.out.println("🔄 PostgreSQL: 开始事务");
    }

    @Override
    public void commit() {
        System.out.println("✅ PostgreSQL: 提交事务");
    }

    @Override
    public void rollback() {
        System.out.println("❌ PostgreSQL: 回滚事务");
    }
}

/**
 * 【4】抽象工厂接口(可选,Spring 中可省略)
 */
interface DatabaseFactory {
    Connection getConnection();
    Transaction getTransaction();
}

/**
 * 【5】Spring 配置类:实现抽象工厂逻辑(推荐写法)
 */
@Configuration
public class DatabaseConfig {

    @Value("${database.type:mysql}") // 从 application.yml 读取
    private String dbType;

    // ✅ 工厂方法:根据配置返回对应产品族
    @Bean
    @Primary // 默认 Bean
    public Connection connection() {
        return switch (dbType.toLowerCase()) {
            case "mysql" -> applicationContext.getBean("mysqlConnection", Connection.class);
            case "postgresql" -> applicationContext.getBean("postgresqlConnection", Connection.class);
            default -> throw new IllegalArgumentException("不支持的数据库类型:" + dbType);
        };
    }

    @Bean
    public Transaction transaction() {
        return switch (dbType.toLowerCase()) {
            case "mysql" -> applicationContext.getBean("mysqlTransaction", Transaction.class);
            case "postgresql" -> applicationContext.getBean("postgresqlTransaction", Transaction.class);
            default -> throw new IllegalArgumentException("不支持的数据库类型:" + dbType);
        };
    }

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

/**
 * 【6】服务层:使用产品族
 */
@Service
public class OrderService {

    @Autowired
    private Connection connection; // Spring 自动注入

    @Autowired
    private Transaction transaction; // Spring 自动注入

    public void processOrder() {
        System.out.println("📦 开始处理订单...");
        connection.connect(); // 连接数据库
        transaction.begin();  // 开始事务
        transaction.commit(); // 提交事务
        System.out.println("✅ 订单处理完成");
    }
}

/**
 * 【7】配置文件:application.yml
 */
/*
database:
  type: postgresql  # 切换为 mysql 或 postgresql,无需改代码!
*/

/**
 * 【8】启动类测试
 */
@SpringBootApplication
public class SpringAbstractFactoryDemo {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(SpringAbstractFactoryDemo.class, args);
        OrderService service = context.getBean(OrderService.class);
        service.processOrder();

        // 输出(当 db.type=postgresql):
        // 📦 开始处理订单...
        // 🔌 PostgreSQL: 成功连接到 PostgreSQL 数据库
        // 🔄 PostgreSQL: 开始事务
        // ✅ PostgreSQL: 提交事务
        // ✅ 订单处理完成
    }
}
✅ 优点:
  • 零手写工厂类:Spring 自动管理 Bean 生命周期
  • 配置驱动:application.yml 动态切换整个产品族
  • 支持 AOP、事务、缓存:所有 Spring 功能自动生效
  • 类型安全:编译期检查 Bean 类型
  • 真正企业级实现:Spring Data JPA、MyBatis、RabbitMQ 都是这样实现的!
💡 Spring 的精髓:

你不需要写 DatabaseFactory 接口,因为 Spring 容器本身就是抽象工厂!
@Bean 方法 = 抽象工厂的 createProductA()
@Value + @Conditional = 动态选择产品族


🔹 3. 抽象工厂模式 + 枚举 + 注解(轻量级高级写法)

适用于产品族固定、不频繁变更的场景,代码更简洁

/**
 * 【1】数据库类型枚举
 */
public enum DatabaseType {
    MYSQL, POSTGRESQL
}

/**
 * 【2】产品接口(同上)
 */
interface Connection {
    void connect();
}

interface Transaction {
    void begin();
    void commit();
    void rollback();
}

/**
 * 【3】具体产品
 */
class MySQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 MySQL: 连接成功");
    }
}

class MySQLTransaction implements Transaction {
    @Override
    public void begin() { System.out.println("🔄 MySQL: 开始事务"); }
    @Override
    public void commit() { System.out.println("✅ MySQL: 提交事务"); }
    @Override
    public void rollback() { System.out.println("❌ MySQL: 回滚事务"); }
}

class PostgreSQLConnection implements Connection {
    @Override
    public void connect() {
        System.out.println("🔌 PostgreSQL: 连接成功");
    }
}

class PostgreSQLTransaction implements Transaction {
    @Override
    public void begin() { System.out.println("🔄 PostgreSQL: 开始事务"); }
    @Override
    public void commit() { System.out.println("✅ PostgreSQL: 提交事务"); }
    @Override
    public void rollback() { System.out.println("❌ PostgreSQL: 回滚事务"); }
}

/**
 * 【4】抽象工厂接口
 */
interface DatabaseFactory {
    Connection createConnection();
    Transaction createTransaction();
}

/**
 * 【5】枚举实现抽象工厂(每个枚举常量是一个工厂)
 */
public enum DatabaseFactoryProvider implements DatabaseFactory {
    MYSQL {
        @Override
        public Connection createConnection() {
            return new MySQLConnection();
        }

        @Override
        public Transaction createTransaction() {
            return new MySQLTransaction();
        }
    },
    POSTGRESQL {
        @Override
        public Connection createConnection() {
            return new PostgreSQLConnection();
        }

        @Override
        public Transaction createTransaction() {
            return new PostgreSQLTransaction();
        }
    };

    // 静态方法:根据枚举值获取工厂
    public static DatabaseFactoryProvider fromString(String type) {
        for (DatabaseFactoryProvider p : values()) {
            if (p.name().equalsIgnoreCase(type)) {
                return p;
            }
        }
        throw new IllegalArgumentException("未知数据库类型:" + type);
    }
}

/**
 * 【6】客户端
 */
public class EnumAbstractFactoryDemo {
    public static void main(String[] args) {
        String dbType = "MYSQL"; // 从配置读取

        DatabaseFactory factory = DatabaseFactoryProvider.fromString(dbType);

        Connection conn = factory.createConnection();
        Transaction tx = factory.createTransaction();

        conn.connect();
        tx.begin();
        tx.commit();
    }
}
✅ 优点:
  • 类型安全:枚举值有限,编译期检查
  • 无反射:性能高
  • 适合静态配置
⚠️ 缺点:
  • 不支持动态加载(如从数据库读取)
  • 不适合 Spring 管理的 Bean

✅ 六、抽象工厂模式的避坑指南(Java 后端高频踩坑)

问题原因解决方案
❌ 混淆工厂方法和抽象工厂误以为“创建多个对象”就是抽象工厂✅ 判断:是否创建配套产品族?是 → 抽象工厂
❌ 产品族不配套MySQL 连接 + Oracle 事务✅ 用抽象工厂强制配套,或用 Spring Bean 依赖注入
❌ 在抽象工厂中注入具体实现违反依赖倒置✅ 所有产品用接口,工厂只返回接口
❌ 忘记使用配置驱动手动写 if-else✅ 用 @Value + @Conditional 自动选择
❌ 用抽象工厂创建简单对象过度设计✅ 字段少于 3 个,用工厂方法或直接 new
❌ 没有单元测试难以验证产品族一致性✅ 编写测试验证 connection 和 transaction 来自同一工厂

✅ 七、抽象工厂模式 vs 工厂方法模式 对比总结表

维度工厂方法模式抽象工厂模式
产品数量一个一组(产品族)
产品关系独立相互依赖、必须配套
客户端关注点“我要一个支付方式”“我要一套完整的数据库系统”
扩展难度新增一个产品新增一个产品族
典型实现PaymentFactory.create()DatabaseFactory.createConnection() + createTransaction()
Spring 对应@Bean 返回单个 Bean@Bean 返回一组协同的 Bean
推荐使用支付方式、日志输出数据库、缓存、消息队列、安全认证

✅ 终极口诀:
“一个产品选工厂方法,一套系统选抽象工厂”


✅ 八、抽象工厂模式的典型实战案例:多租户 SaaS 系统

一个 SaaS 平台,不同租户使用不同缓存、不同日志、不同数据库

// 抽象产品族
interface Cache { void put(String key, Object value); }
interface Logger { void info(String msg); }
interface Database { void execute(String sql); }

// 产品族1:Redis 系统
class RedisCache implements Cache { public void put(String key, Object value) { System.out.println("🚀 Redis: 缓存 " + key); } }
class RedisLogger implements Logger { public void info(String msg) { System.out.println("📝 Redis 日志: " + msg); } }
class RedisDatabase implements Database { public void execute(String sql) { System.out.println("💾 Redis DB: " + sql); } }

// 产品族2:Memcached 系统
class MemcachedCache implements Cache { public void put(String key, Object value) { System.out.println("⚡ Memcached: 缓存 " + key); } }
class MemcachedLogger implements Logger { public void info(String msg) { System.out.println("📝 Memcached 日志: " + msg); } }
class MemcachedDatabase implements Database { public void execute(String sql) { System.out.println("💾 Memcached DB: " + sql); } }

// 抽象工厂
interface TenantFactory {
    Cache createCache();
    Logger createLogger();
    Database createDatabase();
}

// 具体工厂
class RedisTenantFactory implements TenantFactory {
    @Override public Cache createCache() { return new RedisCache(); }
    @Override public Logger createLogger() { return new RedisLogger(); }
    @Override public Database createDatabase() { return new RedisDatabase(); }
}

class MemcachedTenantFactory implements TenantFactory {
    @Override public Cache createCache() { return new MemcachedCache(); }
    @Override public Logger createLogger() { return new MemcachedLogger(); }
    @Override public Database createDatabase() { return new MemcachedDatabase(); }
}

// 服务层
@Service
public class TenantService {

    @Autowired
    private TenantFactory factory; // 由 Spring 根据租户 ID 自动注入

    public void processRequest() {
        Cache cache = factory.createCache();
        Logger logger = factory.createLogger();
        Database db = factory.createDatabase();

        cache.put("user:1001", "张三");
        logger.info("用户登录");
        db.execute("SELECT * FROM users WHERE id=1001");
    }
}

✅ Spring 实现:
用 @ConditionalOnProperty + @Profile + @Bean,根据租户 ID 动态注入不同工厂!


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

阶段建议
📚 第一周用抽象工厂模式重构你项目中的“数据库 + 事务”模块(MySQL/PostgreSQL)
📚 第二周用 Spring @Bean + @Value 实现数据库类型动态切换
📚 第三周用抽象工厂模式实现“缓存系统”(Redis vs Caffeine)
📚 第四周阅读 Spring Boot 源码:DataSourceAutoConfiguration 如何实现抽象工厂?
📚 面试准备准备回答:

“你项目中哪里用了抽象工厂?”
“抽象工厂和工厂方法区别?”
“Spring 中如何实现抽象工厂?”
“多租户系统如何用抽象工厂?” |


✅ 十、抽象工厂模式面试高频题(附答案)

Q1:抽象工厂模式解决了什么问题?

A:解决了一次性创建一组相互依赖、风格一致的对象的问题,确保产品族一致性。

Q2:抽象工厂模式和工厂方法模式的区别?

A:

  • 工厂方法:创建一个对象(如支付方式)
  • 抽象工厂:创建一组对象(如数据库连接+事务+SQL解析器)
    → 一个管“单件”,一个管“套装”

Q3:Spring 中的 @Bean 是抽象工厂吗?

A:是的!@Bean 方法创建一组协同工作的 Bean,就是抽象工厂模式的体现。

Q4:什么时候不该用抽象工厂?

A:产品之间没有依赖关系,或只需创建一个对象,此时用工厂方法更简单。

Q5:抽象工厂模式如何实现热切换?

A:通过配置文件(如 application.yml)或数据库配置动态注入不同工厂实现,Spring 自动切换。


✅ 十一、总结:抽象工厂模式选型决策树

graph TD
    A[需要创建多个对象吗?] --> B{这些对象是否必须配套使用?}
    B -->|是| C{是否使用 Spring?}
    C -->|是| D[用 @Bean + @Value + @Conditional 自动注入产品族]
    C -->|否| E[用抽象工厂接口 + 具体工厂类]
    B -->|否| F[用工厂方法模式]

✅ 最终推荐:

  • Spring 项目 → ✅ @Bean + @Value + @Conditional(最优雅)
  • 非 Spring、产品族固定 → ✅ 枚举 + 抽象工厂(最安全)
  • 非 Spring、需扩展 → ✅ 接口 + 具体工厂类(最标准)
  • 绝对不要:手动 new 多个对象、拼凑不配套产品

✅ 十二、结语:真正的高手,不写 new,而写“整套配置”

你不是在学“抽象工厂模式”,你是在学“如何设计一套可插拔、可切换、一致性的系统架构”。

✅ 当你看到 @Bean Connection 和 @Bean Transaction 由同一个 @Value 控制时,你已经掌握了企业级架构的精髓。
✅ 当你用 application.yml 切换整个数据库系统,而不改一行代码时,你已经是架构师了。

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


BPMN2.0规范及流程引擎选型方案 本文主要简明扼要的介绍了BPMN2.0规范的内容,可让读者快速度的了解BPMN2.0所涵盖的主要内容和图形样式。也较为详细的阐述了如何绘制标准的流程图,以及在软件层面中如何实现业务流程功能,和技术选型。 阅读详情

相关推荐

ubuntu20.04开机黑屏卡在/dev/sda1:clean,***files,***blocks,解决心得记录

这个问题如果你百度,会发现目前有很多种解决方法。 有更新显卡驱动的,有卸载上一次安装软件的,还有各种奇奇怪怪的故障原因。 如果你是属于上述情况,那么按照百度和论坛的各种指引操作一般都能解决。 但我这里主要说一种特殊情况,就是我什么也没有操作,我什么也没干。就是正常使用系统关了机突然就报错了。 这也是自己亲自遇到的问题,做个小记录方便以后自己回顾。 上一次出现这种情况我重装系统了,这次用了两个月又出现了,重装成本太高,我接受不了,于是找到解决办法。 首先找个终端进入,进入终端的方法很多,用安装u盘

qq_41517017的博客 2万+

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

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

神经大条蕾弟的博客 346

Python+gensim【中文LDA】简洁模型

文章目录完整代码过程详解words_lsdictionarydictionary.doc2bow函数corpuslda 完整代码 from gensim import corpora, models import jieba.posseg as jp # 待分析文本集 text1 = '美国教练坦言,没输给中国女排,是输给了郎平' text2 = '中国女排世界排名第一?真实水平如何,听听巴西和美...

ArYe 2万+

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

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

yakax的博客 289

Crossbar RRAM技术解析:从1TnR架构到存储革命

非易失性存储器(NVM)是数据存储的核心技术,其原理基于物理状态的稳定改变以实现数据持久化。阻变存储器(RRAM)作为一种新兴NVM,利用导电细丝在介质层中的形成与断裂实现数据存储,具有高速、低功耗和结构简单的优势。在工程实践中,RRAM面临潜行路径电流等挑战,而Crossbar提出的1TnR架构通过引入共享晶体管有效解决了这一问题,在保证性能的同时提升了集成密度。该技术与CMOS工艺兼容,支持后端集成与多层堆叠,为高密度存储和嵌入式应用提供了新的解决方案。结合当前行业对高能效、高密度存储的需求,RRAM在

weixin_42523104的博客 317

gnss变形监测基础(四)

监测站的数据采样率指的是监测站在单位时间内收集数据的频率,通常以赫兹(Hz)为单位。在GNSS变形监测中,数据采样率决定了监测系统能够捕捉到的变形动态变化的详细程度和时间分辨率。例如,一个采样率为1Hz的GNSS监测站意味着它每秒钟收集一次位置数据;而一个采样率为10Hz的监测站则每秒钟收集10次位置数据。较高的采样率能够提供更细致的时间序列数据,有助于分析快速变化的动态过程,如地震活动或建筑物的振动响应。然而,较高的采样率也意味着数据量更大,可能需要更多的存储空间和更强大的数据处理能力。

我的博客 1291

设计模式总结

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

qq_34665775的博客 114

21天教你学会PCIe专栏(14)--安全性考虑

1.1 定义安全性(Security):安全性是指保护系统免受未经授权的访问、攻击和破坏,确保数据的机密性、完整性和可用性。1.2 重要性数据保护:保护敏感数据,防止数据泄露和篡改。系统防护:防止恶意攻击,确保系统的稳定性和可靠性。合规性:满足行业标准和法律法规的要求,避免法律风险。用户信任:提高用户对系统的信任度,增强市场竞争力。通过今天的学习,你应该对PCIe安全性的重要性和常见威胁有了深入的了解,掌握了实施安全措施的方法和工具,以及安全开发的最佳实践。

xiaoheshang_123的博客 850

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

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

2401_84910888的博客 900

mabl:AI原生测试自动化平台的基础使用

mabl是一个基于人工智能和机器学习的云原生测试自动化平台。它通过使用先进的技术,如机器学习,自动创建和执行测试,自动分析测试结果,并根据需求的变化自动适配和维护测试。这样的自动化过程极大地提高了软件测试的效率和准确性。mabl的口号是 “You write code, mabl tests”,意味着开发者只需关注编写代码,而测试工作则可以交给mabl来完成。mabl的平台支持多种测试类型,包括 Web、App、Api、可访问性和性能测试,使得团队能够更快速、更有信心地发布软件。

blues_C的博客 3655

【论文解读--Xdog】新型电驱式四足机器人研制与测试

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、四足机器人体型大小和驱动方式的比较二、四足机器人设计一些重要的结论三、系统控制框架四、系统硬件框架五、力位混合控制(阻抗控制)六、侧向平衡控制(和VMC如出一辙)七、电机驱动系统研制(FOC磁场定向控制)总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对新型电驱式四足机器人研制与测试做个简单的介绍,具体内容后续再更,其他模块可以参

qq_35635374的博客 3724

java进阶(一)+学习笔记

摘要:设计模式是软件开发中针对常见问题的标准化解决方案,分为创建型、结构型和行为型三大类。学习设计模式能提升编程思维、代码质量和系统扩展性。UML类图是表达类关系的建模语言,包含继承、实现、依赖、关联等关系类型。设计原则如开闭原则、单一职责原则等指导模式应用。实际开发中应避免过度设计,理解模式思想比记忆结构更重要,灵活组合模式解决复杂问题。设计模式是提升代码质量的重要工具,但需合理运用才能发挥最大价值。

weixin_41330897的博客 753

【图像超分】论文复现:新手入门必备!Pytorch实现SRGAN!手把手详细教程!代码注释详尽!可用于训练自己的数据集!实时验证模型性能!绘制PSNR曲线图!附训练好的各放大倍数的模型权重文件!

【图像超分】论文精读:SRResNet/SRGAN【图像超分】论文复现:万字长文!Pytorch实现SRResNet代码修改无报错!踩坑全记录!适合各种深度学习新手!帮助你少走弯路!附修改后的代码和PSNR最优的模型权重文件!请配合上述论文精读文章使用,效果更佳!与原论文描述不一样的实现部分,也即可以修改的部分数据集使用:论文中是ImageNet随机选35000张图像,本文是VOC2012数据集16700张图像。数据集预处理:裁剪大小不同,论文是96×96,本文是88×88。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 6852

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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

程序架构设计之总结23种设计模式

程序架构设计 本章主要讲解程序设计的设计模式,开发代码过程中代码质量很重要的,包括健壮性、可维护、可扩展、可替换复用等等,比如:开闭原则(对扩展开放,对修改关闭,在不修改现有代码的前提下对程序进行扩展)等等。所以什么场景采用什么设计模式是需要考虑从整体权衡。 那么什么是程序的设计模式呢? 专业的解释是:针对软件开发过程中重复发生的问题的解决方式方法。 因为设计模式并不是万能公式,也不可滥用,归其根...

weixin_36009034的博客 776

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

2401_84538544的博客 798

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

MySQL数据库:java实现抽象工厂模式

阿里巴巴一面 自我介绍这个就不说了,开头必问的 说一下StringBuilder 和 StringBuffer Spring bean加载,实例化的过程 Spring AOP源码看过吗 java内存模型说一下 如果给你一个map,里面有很多很多对象,那么这个map存放在哪 了解GC算法吗? 说一下CMS垃圾回收器 B+树和B树的区别? haspmap底层讲一讲 ConcurrentHashMap的底层实现? CAS是硬件实现还是软件实现? volatile是锁吗? 淘宝和京东的区别,你觉得是什么? 项目

m0_57205294的博客 181

CLIP-GmP-ViT-L-14助力Java面试:图解常见设计模式与代码意图匹配

本文介绍了如何利用星图GPU平台,一键自动化部署CLIP-GmP-ViT-L-14图文匹配测试工具,以创新方式辅助Java面试。该工具通过计算设计模式标准图示与候选人代码意图描述之间的语义相似度,为评估其对设计模式的理解提供客观、可量化的参考,从而提升面试评估的效率和精准度。

weixin_35871529的博客 26

工厂模式和抽象工厂模式及java出处

设计模式书写:已会 java出处:myabtis源码深度学习https://blog.youkuaiyun.com/RabbitInTheGrass/article/details/106626747

xajh_czbk的博客 90

关于 Apache Spark 中大数据处理的某些方面,第 2 部分:有用的设计模式

Apache Spark 中大数据处理的某些方面

m0_51679196的博客 233

2024年最全设计模式(4)——单例模式的学习及其六大战将,富士康java面试题整理

学习视频:本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取学习视频:[外链图片转存中…(img-QRkEhEQY-1715120721064)]大厂面试真题:[外链图片转存中…(img-XrKKePa4-1715120721065)]本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取。

2401_84558508的博客 959

又一里程碑!阿里新产“Java全栈进阶笔记”上线一天下载量突破20w,手慢无!

其实像阿里p7岗位的需求也没那么难(但也不简单),扎实的Java基础+无短板知识面+对某几个开源技术有深度学习+阅读过源码+算法刷题,这一套下来p7岗差不多没什么问题,还是希望大家都能拿到高薪offer吧。partition的数据文件(offset,MessageSize,data)当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了。当然在这还有更多整理总结的Java进阶学习笔记和面试题未展示,其中囊括了。默认使用的是什么通信框架,还有别的选择吗?服务提供者能实现失效踢出是什么原理?

2301_82242779的博客 832

最全Java学习路线图(3),成功收获美团,小米offer

程,涵盖了95%以上大数据知识点,真正体系化!

2401_84184729的博客 351

Java 面试进阶攻略:7 大技能 +12 份进阶笔记 + 面试 150 题

以下都是阿里大牛推荐的主流技术,当你全部掌握上述的这些技术那么你就已经是 P8 级别,而且你也已经形成了自己的体系,当更加新潮的技术出来时那么你自己稍微花点时间就能吃透,毕竟那时候你已经不是以前的那个你了, 懂底层原理,知道性能特征,以及功能,想要弄懂新的技术那么也不会太吃力。希望这些能对你的架构师成长之路,起到一定的帮助,文末还准备许多架构进阶学习资料,可获取。JVM 优化,Java 程序优化,tomcat 优化,Linux 优化,SQL 优化等。堆,栈,队列,hash,链表等。单例模式,建造者模式。

fuladulu的博客 45

上海大厂Java面试经历:docker查看镜像文件

一、先来解读:23种设计模式要点 1.单例模式(Singleton Pattern) 2.工厂模式 3.抽象工厂模式(Abstract Factory Pattern) 4.模板方法模式(Template Method Pattern) 5.建造者模式(Builder Pattern) 6.代理模式(Proxy Pattern) 7.原型模式(Prototype Pattern) 8.中介者模式 9.命令模式 10.责任链模式 11.装饰模式(Decorator Pattern) 12.策略模式

m0_57205780的博客 98

大厂面试必考:MQ

从时间节点上来看,3月、4月是每年跳槽的黄金季!以 BAT 为代表的互联网大厂,无论是薪资待遇、还是平台和福利,都一直是求职者眼中的香饽饽,“大厂经历”在国内就业环境中无异于一块金子招牌...

JAVA高级架构 356
上一篇: 7、(创建型设计模式)Java 建造者模式深度学习指南
下一篇: 8、(结构型设计模式)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、付费专栏及课程。

余额充值