跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Javajava算法

Java 设计模式:工厂模式实现与解析

工厂模式通过集中管理对象创建逻辑,实现业务代码与具体实现的解耦。示例展示了基于接口的形状系统,利用工厂类根据参数返回不同实例。这种方式简化了客户端调用,增强了系统的灵活性和可维护性,是 Java 面向对象设计的核心实践之一。

BackendPro发布于 2017/5/8更新于 2026/10/2599 浏览
Java 设计模式:工厂模式实现与解析

Java 设计模式:工厂模式

在面向对象开发中,我们常需要创建大量具有相同接口的对象。如果直接在客户端使用 new 关键字,会导致代码耦合度过高,一旦新增产品类型,所有调用处都可能需要修改。工厂模式正是为了解决这个问题而诞生的,它将对象的实例化过程封装起来。

1. 定义统一接口

首先,我们需要定义一个抽象层,确保所有产品都遵循相同的规范。这里我们创建一个 Shape 接口,规定所有形状都必须具备绘制能力。

public interface Shape {
    void draw();
}

2. 具体实现类

接下来,我们根据业务需求实现具体的形状类。每个类都实现了 Shape 接口,并提供了各自的绘制逻辑。比如圆形、矩形和正方形。

public class Circle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Circle::draw() method.");
    }
}

public class Rectangle implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Rectangle::draw() method.");
    }
}

public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("Inside Square::draw() method.");
    }
}

3. 创建工厂类

这是核心部分。工厂类负责根据传入的参数决定返回哪个具体类型的对象。客户端不需要知道具体的类名,只需要告诉工厂它需要什么。

public class ShapeFactory {
    public static Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }
        if (shapeType.equalsIgnoreCase("CIRCLE")) {
            return new Circle();
        } else if (shapeType.equalsIgnoreCase("SQUARE")) {
            return new Square();
        } else if (shapeType.equalsIgnoreCase("RECTANGLE")) {
            return new Rectangle();
        }
        return null;
    }
}

注意这里使用了 equalsIgnoreCase,这样即使参数大小写不一致也能正常工作,增加了容错性。同时,当没有匹配的类型时返回 null,实际生产中建议抛出异常或返回默认对象。

4. 客户端测试

最后,我们在主程序中通过工厂获取对象。你会发现,客户端代码完全解耦了具体类的依赖,后续如果要增加新的形状(比如三角形),只需新增类并在工厂中添加判断逻辑即可,无需修改现有调用代码。

public class Test {
    public static void main(String[] args) {
        Shape shape1 = ShapeFactory.getShape("circle");
        Shape shape2 = ShapeFactory.getShape("square");
        Shape shape3 = ShapeFactory.getShape("rectangle");
        
        shape1.draw();
        shape2.draw();
        shape3.draw();
    }
}

总结

简单工厂模式通过引入一个工厂类来统一管理对象的创建,有效降低了系统耦合度。虽然它在扩展性上存在一定局限(违反开闭原则),但在结构简单的场景下非常实用,是理解设计模式的入门首选。

目录

  1. Java 设计模式:工厂模式
  2. 1. 定义统一接口
  3. 2. 具体实现类
  4. 3. 创建工厂类
  5. 4. 客户端测试
  6. 总结

更多推荐文章

查看全部
  • OpenClaw + cpolar:打造本地 AI 智能体,实现外网远程访问与控制
  • 即时通讯系统核心模块:从传输到存储的全链路设计
  • OpenClaw 推动低代码 AI 向执行层演进:从工具赋能到生态重构
  • Python 实现音乐数据自动化采集与代理方案
  • ZXing-C++ 跨平台条码识别实现指南
  • Spring Cloud Gateway 内置 Filter 实战:AddRequestHeader 与 RewritePath
  • 使用 FastAPI 和 HTML/CSS/JavaScript 构建博客系统示例
  • 《大模型应用开发极简入门》核心技术与实战指南
  • 基于 Unity 2022 LTS 与 UXR 3.0 SDK 开发 Rokid AR 消消乐游戏
  • DocxFactory:基于 C++ 的 Word 文档处理开源库
  • Java 反射与方法句柄:动态编程深度解析
  • TI AFE5816:16 通道超声波模拟前端 (AFE) 详解
  • OpenClaw 接入 QVeris:为 AI 助手赋予实时数据查询能力
  • 火影忍者主题网页设计实战——从布局到动效实现
  • RabbitMQ/Spring-AMQP 事务与消息限流高级特性详解
  • Spring 事务管理与传播机制详解
  • C++ STL 容器底层剖析:unordered_map 与 unordered_set
  • 大语言模型 (LLM) 基础:原理、应用与挑战
  • 农业大模型:关键技术、应用场景与未来趋势
  • Web3 核心概念与业务应用场景解析

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online