浅析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深入讲解SPI的使用

    Java深入讲解SPI的使用 什么是SPI SPI全称为Service Provider Interface,是Java提供的一种服务发现机制,它通过在classpath路径下查找META-INF/services目录中的配置文件,来实现对接口的实现类自动发现。简单来说,它为接口的实现提供了解耦、可扩展的方式。 SPI的使用步骤 1.创建接口 public …

    Java 2023年5月26日
    00
  • java连不上mysql8.0问题的解决方法

    以下是详细讲解”java连不上mysql8.0问题的解决方法”的完整攻略。 问题背景 在使用Java开发中,经常会使用MySQL作为数据存储的工具。但是在使用最新版本的MySQL(例如8.0版本)时,可能会出现无法连接数据库的问题。这可能是因为MySQL的默认加密机制所导致。 解决方法 方法一:设置MySQL的加密方式 在MySQL8.0版本中,默认采用了c…

    Java 2023年6月16日
    00
  • java解析出url请求的路径和参数键值对类(解析出url请求的路径,包括页面)

    下面是详细的攻略: 1. 确定需求和目标 在写代码之前,我们需要明确自己的目标和需求,即需要完成什么样的功能。根据题目的要求,我们需要编写一个Java类,该类可以解析出传入的URL请求的路径和参数键值对。 2. 解析路径和参数 在Java中,我们可以使用Java内置的类库中的java.net.URL和java.net.URLConnection类来获取URL…

    Java 2023年6月15日
    00
  • SpringMvc框架的简介与执行流程详解

    以下是关于“SpringMVC框架的简介与执行流程详解”的完整攻略,其中包含两个示例。 1. 前言 SpringMVC是一种常用的Java Web开发框架,它基于MVC(Model-View-Controller)模式,将Web应用程序分为三个部分:模型、视图和控制器。本攻略将详细讲解SpringMVC框架的简介和执行流程。 2. 简介 SpringMVC框…

    Java 2023年5月16日
    00
  • spring boot RestTemplate 发送get请求的踩坑及解决

    关于“spring boot RestTemplate 发送get请求的踩坑及解决”的完整攻略,我将分为以下几个部分逐一进行讲解: 介绍RestTemplate发送get请求的基本用法 分析在发送get请求时可能遇到的踩坑 解决get请求中可能遇到的问题 最后,提供至少两个示例说明。 1. RestTemplate发送get请求的基本用法 RestTempl…

    Java 2023年5月26日
    00
  • Spring Boot 集成JWT实现前后端认证的示例代码

    下面是详细讲解“Spring Boot集成JWT实现前后端认证的示例代码”的攻略。 什么是JWT JWT全称为JSON Web Token。它是一种轻量级的身份验证机制,可以用于前后端之间的认证和授权。使用JWT进行认证,可以避免服务端为每个客户端的请求保存会话状态,从而提高服务的可伸缩性。 JWT由三部分组成:头部(Header)、载荷(Payload)和…

    Java 2023年5月20日
    00
  • Java中常见的日期操作(取值、转换、加减、比较)

    Java中日期操作是常见的编程场景之一,本文将详细介绍Java中常见的日期操作,包括日期的取值、转换、加减、比较等方面的知识。 日期的取值 在Java中,我们可以使用java.util.Date或java.sql.Date类获取系统的当前日期和时间。其中,java.util.Date表示的是时间戳,而java.sql.Date则表示日期。 // 获取当前日期…

    Java 2023年5月20日
    00
  • Java Apache Commons报错“SAXException”的原因与解决方法

    “SAXException”是Java的Apache Commons类库中的一个异常,通常由以下原因之一引起: 无效的XML文档:如果XML文档无效,则可能会出现此错误。在这种情况下,需要检查XML文档以解决此问题。 无效的XML解析器:如果XML解析器无效,则可能会出现此错误。在这种情况下,需要检查XML解析器以解决此问题。 以下是两个实例: 例1 如果X…

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