四.抽象工厂模式

一.抽象工厂模式的定义

提供一个接口用于创建‌相关或依赖对象的家族‌,而无需指定具体类。客户端通过抽象接口获取对象,与具体实现解耦。

  • 强调‌产品族一致性‌
  • 与工厂方法模式区别:‌抽象工厂生产多类产品,工厂方法生产单类产品

二.核心结构

角色 职责
抽象工厂 声明创建产品族的方法
具体工厂 实现接口,生成特定产品族对象
抽象产品 定义产品接口
具体产品 实现产品接口

三.案例

通俗来讲,抽象工厂模式是多个工厂方法模式组合起来,是它的升级版。它定义了一个工厂接口或抽象类,这个工厂可以创建一组相关或依赖对象的家族(比如;发动机、轮胎等等组合起来才是一辆汽车),每个具体工厂实现这个接口时,都会为这一组产品提供各自的实现。这组产品中的每一个对象,都可以看作是一个独立的"工厂方法模式"的产物。

工厂方法模式适用于单一产品的创建,抽象工厂模式适用于一组相关产品的创建。

java 复制代码
// 抽象产品:发动机
interface Engine {
    void start();
}

// Tesla专用发动机
class ElectricEngine implements Engine {
    public void start() { 
        System.out.println("特斯拉电机启动 - 无声运转"); 
    }
}

// Toyota专用发动机
class CombustionEngine implements Engine {
    public void start() { 
        System.out.println("丰田发动机启动 - 引擎轰鸣"); 
    }
}

// 抽象产品:轮胎
interface Tire {
    void grip();
}

// Tesla专用轮胎
class SportTire implements Tire {
    public void grip() { 
        System.out.println("运动轮胎 - 赛道级抓地力"); 
    }
}

// Toyota专用轮胎
class AllWeatherTire implements Tire {
    public void grip() { 
        System.out.println("全气候轮胎 - 全天候安全保障"); 
    }
}

// 抽象工厂:生产配套产品族
interface CarFactory {
    Engine createEngine();  // 不再单一!
    Tire createTire();      // 多产品协同生产
}

// Tesla产品族工厂
class TeslaFactory implements CarFactory {
    public Engine createEngine() {
        return new ElectricEngine();  //电动车专用电机
    }
    
    public Tire createTire() {
        return new SportTire();       //性能轮胎
    }
}

// Toyota产品族工厂
class ToyotaFactory implements CarFactory {
    public Engine createEngine() {
        return new CombustionEngine(); //燃油发动机
    }
    
    public Tire createTire() {
        return new AllWeatherTire();   //全天候轮胎
    }
}

public class CarAssembly {
    public static void main(String[] args) {
        // 根据需求选择完整产品族
        CarFactory factory = selectFactory("eco"); 
        
        // 配套产品自动组合(无需手动匹配)
        Engine engine = factory.createEngine();
        Tire tire = factory.createTire();
        
        // 确保兼容性:Tesla电机不会配错丰田轮胎
        engine.start();
        tire.grip();
    }
    
    private static CarFactory selectFactory(String mode) {
        return "eco".equals(mode) ? 
            new TeslaFactory() :   // 整套电动车方案
            new ToyotaFactory();   // 整套燃油车方案
    }
}

四.应用场景

抽象工厂模式和工厂方法模式的应用场景一直,但它们适用的"粒度"和"复杂度"不同。

例如:多支付渠道系统

工厂方式模式可以创建支付接口。但是如果需要支付接口、回调处理器、日志记录器时,就需要抽象工厂模式。

java 复制代码
💡 如果本文对你有帮助,点击右上角【订阅专栏】或左上角关注我  
🔔 完整的23中设计模式干货,第一时间推送给你!
🔔 有什么问题也可以在评论区讨论🤝🤝🤝
相关推荐
LucianaiB1 分钟前
如何做好一份优秀的技术文档:专业指南与最佳实践
android·java·数据库
面朝大海,春不暖,花不开25 分钟前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y26 分钟前
Java安全点safepoint
java
夜晚回家1 小时前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组1 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1801 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea
wtg44521 小时前
使用 Rest-Assured 和 TestNG 进行购物车功能的 API 自动化测试
java
白宇横流学长2 小时前
基于SpringBoot实现的大创管理系统设计与实现【源码+文档】
java·spring boot·后端
fat house cat_2 小时前
【redis】线程IO模型
java·redis
stein_java3 小时前
springMVC-10验证及国际化
java·spring