浅析Java单例设计模式(自写demo)

浅析Java单例设计模式(自写demo)

1. 什么是单例模式?

单例模式是常用的一种设计模式,它的主要思想是保证在整个应用程序中只存在唯一的一个实例对象。

通常情况下,在实际开发的过程中,我们希望一个类只存在一个实例对象,这个时候就可以考虑使用单例模式,实际上单例模式是一种可重用的面向对象设计。

2. 如何实现单例模式?

单例模式的实现有多种方式,这里介绍其中一种较为常见的方式——懒汉式单例模式。

懒汉式单例模式的实现过程如下:

1. 私有化构造函数

首先定义一个类,将其构造函数私有化,这样外界就无法通过new关键字来创建该类的实例对象。

public class Singleton {
    private Singleton() {}
}

2. 定义一个私有静态变量

定义一个私有静态变量来引用该类的唯一实例,因为是静态变量,所以当第一次使用时就会加载到内存中。由于该变量是私有的,因此只能在类内部访问。

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
}

3. 提供一个公有的静态方法来获取该实例

对外提供一个公有的静态方法来获取该实例,这个方法的作用就是创建该类的实例对象,如果已经存在该对象,则直接返回该对象。

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

4. 完整代码

完整代码如下:

public class Singleton {
    private static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3. 示例说明

3.1 示例1

接下来我们通过一个例子来说明懒汉式单例模式的作用。

在这个例子中,我们定义一个班级类,这个班级有多个学生,我们需要统计这个班级中的学生人数。由于班级类只需要被实例化一次,因此我们可以使用懒汉式单例模式来实现。

public class Student {
    private String name;
    private int age;
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略get/set方法
}

public class Class {
    private List<Student> students = new ArrayList<>();
    private static Class instance;
    private Class() {}
    public static Class getInstance() {
        if (instance == null) {
            instance = new Class();
        }
        return instance;
    }
    public void addStudent(Student student) {
        students.add(student);
    }
    public int getStudentCount() {
        return students.size();
    }
}

我们先创建一个学生实例,并添加到班级中:

Student s1 = new Student("小明", 18);
Class c = Class.getInstance();
c.addStudent(s1);

然后我们再创建一个学生实例,并添加到班级中:

Student s2 = new Student("小红", 17);
c.addStudent(s2);

最后我们输出该班级中的学生人数:

System.out.println(c.getStudentCount()); // 输出2

在上面的代码中,我们只创建了一个班级实例,并向该班级中添加两个学生,我们通过调用c.getStudentCount()方法来获取该班级中的学生人数,输出结果为2。

3.2 示例2

接下来我们通过另一个例子来说明单例模式的作用。

在这个例子中,我们定义一个日志类,用来记录系统日志。由于系统中只需要有一个日志实例,因此我们可以使用单例模式来实现。

public class Logger {
    private static Logger instance;
    private List<String> logs = new ArrayList<>();
    private Logger() {}
    public static Logger getInstance() {
        if (instance == null) {
            instance = new Logger();
        }
        return instance;
    }
    public void addLog(String log) {
        logs.add(log);
    }
    public void printLogs() {
        for (String log : logs) {
            System.out.println(log);
        }
    }
}

我们先创建一个Logger实例,并添加日志:

Logger logger = Logger.getInstance();
logger.addLog("系统启动");
logger.addLog("创建用户");
logger.addLog("删除用户");
logger.addLog("系统关闭");

然后我们输出这些日志:

logger.printLogs();

输出结果为:

系统启动
创建用户
删除用户
系统关闭

在上面的代码中,我们只创建了一个Logger实例,并向该实例中添加日志信息,最后我们输出所有日志。通过调用该Logger实例的printLogs()方法,可以输出添加的所有日志信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:浅析Java单例设计模式(自写demo) - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • java之CSV大批量数据入库的实现

    Java之CSV大批量数据入库的实现 背景 在实际项目中,常常需要处理大量的数据,而CSV格式是一种很常见的数据格式,因此对于CSV数据进行入库操作是非常必要的。本文将介绍如何使用Java实现CSV大批量数据入库的实现。 准备工作 在开始正文之前,我们需要进行几个工作: 导入相关依赖 在项目中需要使用opencsv来解析CSV文件,因此需要在maven或gr…

    Java 2023年5月20日
    00
  • 深入理解TextView实现Rich Text–在同一个TextView设置不同字体风格

    深入理解TextView实现Rich Text的攻略如下: 1. 了解Spannable接口 TextView实现富文本的关键在于使用Spannable接口。Spannable是一个接口,用于控制文本的呈现方式,可以在TextView中实现不同的文本样式。 Spannable接口提供了许多实现富文本的方法,如ForegroundColorSpan、Backg…

    Java 2023年5月26日
    00
  • SpringBoot快速整合SpringSecurity的详细步骤(新手都会!)

    Spring Security是一个功能强大的安全框架,可以为Spring Boot应用程序提供身份验证、授权、攻击防护等功能。本文将详细讲解如何快速整合Spring Security到Spring Boot应用程序中,包括如何配置Spring Security、如何定义用户、如何控制访问等。 配置Spring Security 在Spring Boot应用…

    Java 2023年5月15日
    00
  • 面试官:详细谈谈Java对象的4种引用方式

    下面我会详细讲解Java对象的4种引用方式: 一、强引用 (Strong Reference) 强引用是Java中最普通、默认的引用方式,当一个对象被强引用变量引用时,垃圾回收器无法自动对其进行回收。只有在该对象的所有强引用变量被释放后,垃圾回收器才会回收该对象并释放其占用的内存空间。 示例代码: Object obj = new Object(); // …

    Java 2023年5月26日
    00
  • springboot下使用mybatis的方法

    下面是详细的“springboot下使用mybatis的方法”的攻略: 1. 引入依赖 在pom.xml文件中引入mybatis-spring-boot-starter依赖,如下: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId&…

    Java 2023年5月20日
    00
  • Java实战项目 健身管理系统

    Java实战项目健身管理系统是一个比较完整的综合性项目,其中包含了Java Web 开发和数据库操作等多个方面的知识。要完成这个项目,需要按照以下步骤进行: 1. 确定项目需求 首先,需要明确健身管理系统的功能模块,例如会员管理、健身计划管理、课程管理、教练管理等。可以根据具体项目需求和功能模块确定表结构设计、接口设计和页面设计等。 2. 搭建开发环境 在搭…

    Java 2023年5月20日
    00
  • 使用SpringBoot发送邮箱验证码的简单实现

    使用SpringBoot发送邮箱验证码的简单实现攻略: 1. 引入邮件发送相关依赖 这里我使用的是spring-boot-starter-mail,只需要在pom.xml文件中添加如下依赖即可: <dependency> <groupId>org.springframework.boot</groupId> <art…

    Java 2023年6月15日
    00
  • 快速解决VS Code报错:Java 11 or more recent is required to run. Please download and install a recent JDK

    针对题目提供的问题,要快速地解决VS Code报错:“Java 11 or more recent is required to run. Please download and install a recent JDK”,需要进行以下步骤: 下载并安装JDK 11或更高版本 要解决这个问题,你需要下载并安装JDK 11或更高版本,并将其添加到环境变量中。J…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部