java三个工厂设计模式

Java 中的三个工厂设计模式分别是:简单工厂模式、工厂方法模式、抽象工厂模式。它们的核心都是封装对象创建过程,让客户端与具体产品类解耦,但复杂度和适用场景逐步提升。

一、简单工厂模式(Simple Factory Pattern)

  • 核心 :由一个工厂类根据传入参数,决定创建哪一种产品实例。

  • 角色 :

    1. 产品接口:定义产品的公共方法。
    2. 具体产品类:实现产品接口,是工厂创建的目标对象。
    3. 工厂类:包含静态方法,根据参数返回具体产品实例。
  • 优点:客户端无需知道产品创建细节,只需传入参数即可获取对象。

  • 缺点 :工厂类职责过重,新增产品需修改工厂类代码,违反开闭原则。

  • 适用场景:产品类型少、不频繁新增的简单场景。

    // 1. 产品接口
    interface Shape {
    void draw();
    }

    // 2. 具体产品类
    class Circle implements Shape {
    @Override
    public void draw() {
    System.out.println("绘制圆形");
    }
    }

    class Rectangle implements Shape {
    @Override
    public void draw() {
    System.out.println("绘制矩形");
    }
    }

    // 3. 工厂类
    class ShapeFactory {
    // 静态工厂方法
    public static Shape createShape(String type) {
    if ("circle".equalsIgnoreCase(type)) {
    return new Circle();
    } else if ("rectangle".equalsIgnoreCase(type)) {
    return new Rectangle();
    }
    return null;
    }
    }

    // 客户端调用
    public class SimpleFactoryDemo {
    public static void main(String[] args) {
    Shape circle = ShapeFactory.createShape("circle");
    circle.draw(); // 输出:绘制圆形

    复制代码
          Shape rectangle = ShapeFactory.createShape("rectangle");
          rectangle.draw(); // 输出:绘制矩形
      }

    }

二、工厂方法模式(Factory Method Pattern)

  • 核心 :定义工厂接口 ,将产品创建延迟到具体工厂子类实现,一个产品对应一个工厂。

  • 角色 :

    1. 产品接口:同简单工厂。
    2. 具体产品类:同简单工厂。
    3. 工厂接口:定义创建产品的抽象方法。
    4. 具体工厂类:实现工厂接口,负责创建对应具体产品。
  • 优点 :符合开闭原则,新增产品只需新增具体产品和对应工厂,无需修改原有代码。

  • 缺点:类的数量随产品增加而增多,系统复杂度上升。

  • 适用场景:产品类型多、需频繁新增产品的场景。

    // 1. 产品接口
    interface Shape {
    void draw();
    }

    // 2. 具体产品类
    class Circle implements Shape {
    @Override
    public void draw() {
    System.out.println("绘制圆形");
    }
    }

    class Rectangle implements Shape {
    @Override
    public void draw() {
    System.out.println("绘制矩形");
    }
    }

    // 3. 工厂接口
    interface ShapeFactory {
    Shape createShape();
    }

    // 4. 具体工厂类
    class CircleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
    return new Circle();
    }
    }

    class RectangleFactory implements ShapeFactory {
    @Override
    public Shape createShape() {
    return new Rectangle();
    }
    }

    // 客户端调用
    public class FactoryMethodDemo {
    public static void main(String[] args) {
    ShapeFactory circleFactory = new CircleFactory();
    Shape circle = circleFactory.createShape();
    circle.draw(); // 输出:绘制圆形

    复制代码
          ShapeFactory rectangleFactory = new RectangleFactory();
          Shape rectangle = rectangleFactory.createShape();
          rectangle.draw(); // 输出:绘制矩形
      }

    }

三、抽象工厂模式(Abstract Factory Pattern)

  • 核心 :提供接口创建一系列相关 / 依赖的产品对象(产品族),一个工厂可创建多个不同类型的产品。

  • 角色 :

    1. 抽象产品接口:多个(如 Button、Text),定义不同产品的公共方法。
    2. 具体产品类:实现抽象产品接口,属于不同产品族(如 WindowsButton、MacButton)。
    3. 抽象工厂接口:定义创建所有产品的方法。
    4. 具体工厂类:实现抽象工厂接口,创建同一产品族的所有产品。
  • 优点:保证产品族内产品兼容性,新增产品族符合开闭原则。

  • 缺点 :新增产品等级结构(如新增 Checkbox)时,需修改所有工厂类,违反开闭原则。

  • 适用场景:需创建多个产品族、且产品族内产品存在依赖关系的场景(如不同操作系统的 UI 组件)

    // 1. 抽象产品接口(产品等级1:按钮)
    interface Button {
    void click();
    }

    // 抽象产品接口(产品等级2:文本框)
    interface Text {
    void input();
    }

    // 2. 具体产品类(Windows 产品族)
    class WindowsButton implements Button {
    @Override
    public void click() {
    System.out.println("Windows 按钮被点击");
    }
    }

    class WindowsText implements Text {
    @Override
    public void input() {
    System.out.println("Windows 文本框输入");
    }
    }

    // 具体产品类(Mac 产品族)
    class MacButton implements Button {
    @Override
    public void click() {
    System.out.println("Mac 按钮被点击");
    }
    }

    class MacText implements Text {
    @Override
    public void input() {
    System.out.println("Mac 文本框输入");
    }
    }

    // 3. 抽象工厂接口
    interface UIFactory {
    Button createButton();
    Text createText();
    }

    // 4. 具体工厂类(Windows 工厂)
    class WindowsFactory implements UIFactory {
    @Override
    public Button createButton() {
    return new WindowsButton();
    }

    复制代码
      @Override
      public Text createText() {
          return new WindowsText();
      }

    }

    // 具体工厂类(Mac 工厂)
    class MacFactory implements UIFactory {
    @Override
    public Button createButton() {
    return new MacButton();
    }

    复制代码
      @Override
      public Text createText() {
          return new MacText();
      }

    }

    // 客户端调用
    public class AbstractFactoryDemo {
    public static void main(String[] args) {
    // 创建 Windows 产品族
    UIFactory windowsFactory = new WindowsFactory();
    Button windowsButton = windowsFactory.createButton();
    Text windowsText = windowsFactory.createText();
    windowsButton.click(); // 输出:Windows 按钮被点击
    windowsText.input(); // 输出:Windows 文本框输入

    复制代码
          // 创建 Mac 产品族
          UIFactory macFactory = new MacFactory();
          Button macButton = macFactory.createButton();
          Text macText = macFactory.createText();
          macButton.click(); // 输出:Mac 按钮被点击
          macText.input(); // 输出:Mac 文本框输入
      }

    }

|------------|-------------|-------------|-------------|------------------|
| 模式 | 核心特点 | 工厂数量 | 产品创建方式 | 开闭原则 |
| 简单工厂模式 | 单一工厂创建所有产品 | 1 个 | 静态方法 + 参数判断 | 违反 |
| 工厂方法模式 | 一个工厂对应一个产品 | 多个(与产品数一致) | 子类工厂实现创建 | 符合 |
| 抽象工厂模式 | 一个工厂创建一个产品族 | 多个(与产品族数一致) | 工厂创建多个相关产品 | 新增产品族符合,新增产品等级违反 |

总结

  • 简单工厂:基础模式,适合简单场景,缺点是违反开闭原则。
  • 工厂方法:解决了简单工厂的开闭原则问题,适合单一产品类型扩展。
  • 抽象工厂:工厂模式的最高级形态,适合多产品族、多产品类型的复杂场景。
相关推荐
Escalating_xu7 分钟前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅32 分钟前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
Java后端的Ai之路43 分钟前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData1 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat1 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰1 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
Flynn Liang2 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai
灿飞2 小时前
Kotlin与Java虚拟机六:基础与类型系统:一切皆对象,但对象有代价
java·kotlin
计算机毕设定制辅导-无忧学长2 小时前
《基于微信小程序健康习惯激励系统设计与实现》
java·spring boot·mysql·微信小程序·uniapp·健康习惯激励系统
揽星河..2 小时前
【C语言】指针
c语言·开发语言