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

Java 设计模式:单例、工厂与代理模式

Java 设计模式涵盖单例、工厂与代理模式。单例模式保证类仅有一个实例,包含饿汉式与懒汉式两种实现。工厂模式定义创建对象的接口,分离创建与使用过程,便于扩展。代理模式通过中介控制对实际对象的访问,常用于权限校验。这些模式有助于提升代码的可维护性与结构清晰度。

独立开发者发布于 2026/2/7更新于 2026/10/2590 浏览
Java 设计模式:单例、工厂与代理模式

在这里插入图片描述

在 Java 编程中,设计模式是解决常见问题的优秀方案。本文将深入剖析单例模式、工厂模式和代理模式。

一、单例模式

单例模式确保一个类只有一个实例。

1. 饿汉式

程序启动时就进行单例对象的初始化,无论是否被使用。线程安全但可能浪费资源。

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

    public static Singleton getInstance() {
        return instance;
    }
}
public class Test {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);
    }
}

在这里插入图片描述

2. 懒汉式

延迟加载,单例对象在首次访问时才初始化,节省了资源。

public class Singleton2 {
    private static Singleton2 instance;

    private Singleton2() {}

    public static Singleton2 getSingleton() {
        if (instance == null) {
            instance = new Singleton2();
        }
        return instance;
    }
}

二、工厂模式

工厂模式定义一个创建对象的接口,使创建对象的过程和使用对象的过程分离。

  • 创建工厂接口(抽象工程)
public interface UserFactory {
    User createUser(String name, int age);
}
  • 实现具体工厂
public class AdminFactory implements UserFactory {
    @Override
    public User createUser(String name, int age) {
        return new AdminUser(name, age);
    }
}

public class NormalFactory implements UserFactory {
    @Override
    public User createUser(String name, int age) {
        return new NormalUser(name, age);
    }
}
  • 使用方式
public class Test {
    public static void main(String[] args) {
        // 管理员
        UserFactory adminFactory = new AdminFactory();
        User admin = adminFactory.createUser("baby", 10);

        // 用户
        UserFactory normalFactory = new NormalFactory();
        User normal1 = normalFactory.createUser("lisy", 12);
        User normal2 = normalFactory.createUser("long", 14);
    }
}

在工厂方法模式中,每种用户类型都有自己的工厂类。要添加新的用户类型,只需创建新的工厂类,无需修改现有代码。代码不会重复,创建对象的过程封装到了工厂当中更加解耦。

三、代理模式

一个类代表另一个类的功能,通过代理对象来控制实际对象的访问,相当于中介。

  • User 类
public abstract class User {
    protected String name;
    protected int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public abstract void menu();
}
  • NormalUser 和 AdminUser 类的结构如下
public class AdminUser extends User {
    public AdminUser(String name, int age) {
        super(name, age);
    }

    @Override
    public void menu() {
        System.out.println("管理员菜单");
    }

    public void addBook(String bookName) {
        System.out.println("普通用户" + name + "借阅了" + bookName);
    }
}

public class NormalUser extends User {
    public NormalUser(String name, int age) {
        super(name, age);
    }

    @Override
    public void menu() {
        System.out.println("普通用户的菜单");
    }

    public void borrowBook(String bookName) {
        System.out.println("普通用户" + name + "借阅了" + bookName);
    }
}
  • 代理类结构

在该代理类中对 borrowBook、returnBook 方法提供了代理 ProxyUser 为不同类型的 User 提供代理。

public class ProxyUser {
    private User realUser;

    public ProxyUser(User user) {
        this.realUser = user;
    }

    public void menu() {
        this.realUser.menu();
    }

    public void borrowBook(String bookName) {
        System.out.println("检查用户权限");
        if (this.realUser instanceof NormalUser) {
            ((NormalUser) this.realUser).borrowBook(bookName);
        } else {
            System.out.println("没有权限借阅");
        }
    }

    public void addBook(String bookName) {
        System.out.println("检查用户权限");
        if (this.realUser instanceof AdminUser) {
            ((AdminUser) this.realUser).addBook(bookName);
        } else {
            System.out.println("没有权限上架");
        }
    }
}
public static void main(String[] args) {
    UserFactory adminFactory = new AdminFactory();
    User admin = adminFactory.createUser("baby", 10);
    UserFactory normalFactory = new NormalFactory();
    User normal1 = normalFactory.createUser("lisy", 12);

    // 代理模式
    ProxyUser proxyAdminUser = new ProxyUser(admin);
    proxyAdminUser.borrowBook("图书 1");

    ProxyUser proxyNormalUser = new ProxyUser(normal1);
    proxyNormalUser.addBook("图书 1");
    proxyNormalUser.borrowBook("图书 1");
    proxyNormalUser.borrowBook("图书 2");
}

在这里插入图片描述

总结

设计模式不是银弹,而是解决特定问题的优秀思路。在实际开发中,我们要根据具体场景选择合适的设计模式,让代码更加优雅、可维护。

目录

  1. 一、单例模式
  2. 1. 饿汉式
  3. 2. 懒汉式
  4. 二、工厂模式
  5. 三、代理模式
  6. 总结

更多推荐文章

查看全部
  • SmolRTSP:嵌入式系统高效 RTSP 流媒体服务实践
  • 从零打造开源无人机:ESP-Drone 实战指南
  • Python AI 开发环境搭建:Anaconda + PyCharm + Claude Code 安装指南
  • 基于 Java 和 Spring Boot 构建微服务架构:服务注册与发现实战
  • Arduino BLDC 驱动方案:MimiClaw + ESP32 嵌入式机器人实战
  • Nginx 部署前端 Vue 项目指南
  • 耳机阻抗与前端适配:32Ω、150Ω、300Ω耳机的功放推力分析
  • 《AI 提效手册》深度解读:五款主流 AI 工具实战指南
  • Linux 进程池实战:基于管道通信的任务分发系统
  • GitHub Copilot 登录失败的常见原因与排查指南
  • 机器人 SLAM 技术核心原理解析
  • 华三 H3C 交换机 NTP 时间同步配置方法
  • 使用 LLaMA-Factory 微调 Qwen2.5 模型并转换为 GGUF 格式部署
  • 前缀和技巧:和为 K 及可被 K 整除的子数组
  • 基于 GLM 4.7 与 Flutter 开发 AI 漫剧 APP 实战
  • MySQL 亿级数据表平滑分表实践:基于时间分片的架构演进
  • 大模型时代人形机器人感知:视觉 - 语言模型应用
  • 数据结构:链式二叉树递归实现与全方位剖析
  • Xilinx FPGA 开发:Vivado 与 Vitis 流程解析
  • 微信小程序自定义 tabBar 实现方案

相关免费在线工具

  • 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

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online