浅析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日

相关文章

  • Maven基础知识大梳理

    Maven基础知识大梳理 什么是Maven? Maven是一个开源的项目管理工具,用于管理Java项目中的依赖关系、构建过程等。它提供了一个标准的项目结构和一组构建规则,可以让开发人员更加专注于代码本身而不是构建和部署过程。同时,Maven还可以管理项目生命周期,支持丰富的插件机制,可以在构建过程中自动执行测试、生成文档等操作。 Maven的核心概念 POM…

    Java 2023年6月2日
    00
  • Java程序常见异常及处理汇总

    Java程序常见异常及处理汇总 在Java开发过程中,异常是一个非常常见的问题。本文将对常见的Java程序异常进行汇总,并详细讲解如何处理这些异常。 异常概述 在程序运行中,由于各种原因(如输入错误、网络错误等),程序无法继续正常进行,这时就会产生异常。Java中的异常都是派生自java.lang.Throwable类的子类。 异常分为三个主要的类别: Ch…

    Java 2023年5月23日
    00
  • Linux下Varnish缓存服务器的安装与配置教程

    安装Varnish缓存服务器的步骤如下: 1. 更新apt包管理器 使用以下命令更新apt包管理器: sudo apt update 2. 安装Varnish 使用以下命令从Ubuntu存储库中安装Varnish: sudo apt install varnish 3. 配置Varnish服务器 3.1 修改Varnish默认配置 使用以下命令来编辑默认的V…

    Java 2023年6月15日
    00
  • Tomcat 实现WebSocket详细介绍

    Tomcat 实现WebSocket详细介绍 什么是WebSocket? WebSocket是HTML5中的一个协议,它的目标是在Web浏览器和服务器之间建立实时、双向的通信会话,以便实现更好的实时性和降低通信量。以前,为了实现实时通信,使用一些技术如Ajax、Comet等技术,但它们都存在着一些问题,而WebSocket协议能够有效地解决这些问题,因此得到…

    Java 2023年5月19日
    00
  • 常见的Java持久化框架有哪些?

    Java持久化框架是用于将Java对象映射到关系型数据库的工具。常见的Java持久化框架有以下几种: Hibernate:Hibernate是应用广泛的Java ORM(对象关系映射)框架之一,它通过将Java对象映射到关系型数据库中的表来实现数据的持久化。使用Hibernate可以方便地实现数据访问层的开发,同时还提供了丰富的查询语言和事务管理等功能。 M…

    Java 2023年5月11日
    00
  • 浅谈Java 继承接口同名函数问题

    浅谈Java 继承接口同名函数问题 在Java中,当父类和接口中同时存在同名函数时,子类在继承父类并实现接口时,需要注意同名函数的冲突问题。本文将详细讲解Java 继承接口同名函数问题解决方法。 同名函数冲突问题 在Java中,当一个子类继承一个父类并实现一个接口时,如果父类和接口中具有相同名称和参数的方法,那么子类必须对该方法进行实现。 解决方法 为了解决…

    Java 2023年5月26日
    00
  • Sprint Boot @JsonFormat使用方法详解

    @JsonFormat是Spring Boot中的一个注解,用于指定Java对象在序列化为JSON字符串时的日期格式。在本文中,我们将详细介绍@JsonFormat注解的作用和使用方法,并提供两个示例。 @JsonFormat注解的作用 @JsonFormat注解用于指定Java对象在序列化为JSON字符串时的日期格式。当使用@JsonFormat注解标记一…

    Java 2023年5月5日
    00
  • Java基础学习笔记之数组详解

    Java基础学习笔记之数组详解 什么是数组? 数组是Java中最常用的数据结构之一,它是一组相同类型的数据的有序集合,每个数据被称为一个数组元素。是一维数组或多维数组(嵌套数组)。 如何定义数组? 定义数组的语法如下: 数据类型[] 数组名称 = new 数据类型[数组长度]; 其中, 数据类型是指数组中存储元素的类型,数组名称是取自己喜欢的名称,数组长度是…

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