Java工厂模式及抽象工厂模式详解

**一、工厂模式(Factory Pattern)**‌

‌核心思想 ‌:封装对象创建逻辑,解耦客户端与具体类

‌适用场景‌:需要动态创建多种类型对象,避免在客户端代码中硬编码具体类。

‌**1. 简单工厂模式(Simple Factory)**‌
  • ‌结构 ‌:

    • 产品接口(Product)
    • 具体产品类(ConcreteProductA/ConcreteProductB)
    • 工厂类(SimpleFactory)根据参数创建对象
  • ‌代码示例 ‌:

    复制代码
    interface Product { void use(); }
    class ProductA implements Product { public void use() { System.out.println("使用产品A"); } }
    class ProductB implements Product { public void use() { System.out.println("使用产品B"); } }
    
    class SimpleFactory {
        public static Product createProduct(String type) {
            if ("A".equals(type)) return new ProductA();
            else if ("B".equals(type)) return new ProductB();
            throw new IllegalArgumentException("无效类型");
        }
    }
    // 客户端调用
    Product product = SimpleFactory.createProduct("A");
    product.use();  // 输出:使用产品A
  • ‌缺点‌:新增产品需修改工厂类,违反开闭原则。

‌**2. 工厂方法模式(Factory Method)**‌
  • ‌结构 ‌:

    • 抽象工厂接口(Factory)
    • 具体工厂子类(FactoryA/FactoryB)负责创建特定产品
  • ‌代码示例 ‌:

    复制代码
    interface Factory { Product createProduct(); }
    class FactoryA implements Factory {
        @Override public Product createProduct() { return new ProductA(); }
    }
    // 客户端调用
    Factory factory = new FactoryA();
    Product product = factory.createProduct();
  • ‌优势‌:新增产品时只需扩展新工厂类,符合开闭原则。


‌**二、抽象工厂模式(Abstract Factory Pattern)**‌

‌核心思想 ‌:创建‌相关产品族 ‌(多个产品等级),强调产品间的约束关系

‌适用场景‌:需要构建跨平台/跨风格的整套产品(如UI组件库、数据库连接套件)。

‌1. 核心结构‌
‌角色‌ ‌职责‌
抽象工厂(AbstractFactory) 声明创建产品族的方法(如createButton())
具体工厂(ConcreteFactory) 实现具体产品族的创建(如WindowsFactory)
抽象产品(AbstractProduct) 定义产品接口(如Button/TextField)
具体产品(ConcreteProduct) 实现平台相关逻辑(如WindowsButton)
‌**2. 代码示例(跨平台UI组件)**‌
复制代码
// 抽象产品
interface Button { void paint(); }
interface TextField { void render(); }

// 具体产品(Windows风格)
class WindowsButton implements Button {
    @Override public void paint() { System.out.println("Windows风格按钮"); }
}
class WindowsTextField implements TextField {
    @Override public void render() { System.out.println("Windows风格文本框"); }
}

// 抽象工厂
interface GUIFactory {
    Button createButton();
    TextField createTextField();
}

// 具体工厂(Windows产品族)
class WindowsFactory implements GUIFactory {
    @Override public Button createButton() { return new WindowsButton(); }
    @Override public TextField createTextField() { return new WindowsTextField(); }
}

// 客户端调用
GUIFactory factory = new WindowsFactory();
Button button = factory.createButton();
button.paint();  // 输出:Windows风格按钮
‌3. 优势与局限‌
  • ‌优势 ‌:
    • 保证产品族兼容性(如所有Windows组件风格一致)
    • 客户端代码与具体平台解耦
  • ‌局限 ‌:新增产品等级(如新增Checkbox)需修改所有工厂接口 。

‌三、工厂模式 vs 抽象工厂模式对比‌

‌维度‌ 工厂方法模式 抽象工厂模式
‌核心目标‌ 创建单一产品 创建产品族(多个相关产品)
‌产品复杂度‌ 单产品等级 多产品等级(如按钮+文本框)
‌扩展方向‌ 扩展新产品(纵向) 扩展新产品族(横向)
‌典型应用‌ Spring的BeanFactory JDBC的DriverManager

‌四、演进关系与选择建议‌

  1. ‌演进路线 ‌:
    简单工厂 → 工厂方法 → 抽象工厂(复杂度递增)
  2. ‌选型建议 ‌:
    • 单一产品变化 → ‌工厂方法‌(如日志记录器)
    • 多产品组合约束 → ‌抽象工厂‌(如跨平台UI、数据库适配器)
    • 避免滥用:简单场景直接new更高效 。
相关推荐
panxianren6 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
“AI国潮设计-小江”8 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人8 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
sunshine22 girl8 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs8 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang9 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl9 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat10 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
菜鸟~noob23310 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫11 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python