浅析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实现对字符串中的数值进行排序操作示例

    下面我将详细讲解Java实现对字符串中的数值进行排序的完整攻略。 一、背景介绍 在Java中,字符串和数值之间的转换经常会用到,例如读取文件时,文件中的数值都是以字符串的形式呈现的,我们需要对这些数值进行排序等操作,这时就需要进行字符串和数值之间的转换。 二、Java字符串和数值的转换 Java中提供了许多方法来完成字符串和数值之间的转换,下面介绍一些常用的…

    Java 2023年5月19日
    00
  • 详解Springboot之Logback的使用学习

    详解Springboot之Logback的使用学习 什么是Logback Logback是一种开源的日志记录框架,是log4j框架的继任者。Springboot使用Logback作为默认的日志记录框架。Logback由3个模块构成,分别为logback-core、logback-classic和logback-access。其中,logback-core是其…

    Java 2023年5月19日
    00
  • Java的Hibernate框架中用于操作数据库的HQL语句讲解

    关于Java的Hibernate框架中用于操作数据库的HQL语句,我可以提供以下详细攻略。 什么是HQL HQL(Hibernate Query Language)是Hibernate框架中用来操作数据库的面向对象的语言。它类似于SQL,但是使用OOP的方法来表述查询,完全面向对象。 HQL语句的结构 HQL语句的结构与SQL类似,由SELECT、FROM、…

    Java 2023年5月20日
    00
  • Java Validation方法入参校验实现过程解析

    Java Validation方法入参校验实现过程 前言 在实际的开发工作中,对于传入的参数进行校验非常重要,对于一个好的程序员来说,必须具备对参数进行验证的能力。Java提供了校验的解决方案,可以快速开发和验证传递给方法的数据。 步骤 1. 引入Validation框架 在你的Maven项目的POM文件中添加以下依赖: <dependency>…

    Java 2023年5月20日
    00
  • java基本教程之join方法详解 java多线程教程

    Java中的join()方法是多线程编程常用的一个方法,它的作用是让调用该方法的线程等待被调用线程执行完毕后再继续执行。本文将详细讲解join()方法的使用和注意事项。 什么是join()方法 在介绍join()方法之前,我们先回忆一下多线程的基础。在Java中,当创建一个线程对象并调用start()方法后,线程对象就会进入就绪状态,等待CPU分配时间片段并…

    Java 2023年5月18日
    00
  • Java举例讲解分治算法思想

    Java举例讲解分治算法思想 分治算法概述 在计算机科学中,分治算法是一种很重要的算法思想,它的基本思想是将问题划分成若干规模较小但结构相似的子问题,然后分别解决这些子问题,最后通过合并这些子问题的解得到原问题的解。分治算法的步骤分为三步:1. 分解原问题2. 求解子问题3. 合并子问题的解得到原问题的解 示例一 我们来看一个求一组数据里的最大值的分治算法。…

    Java 2023年5月19日
    00
  • Java中Mybatis,SpringMVC,Spring的介绍及联系

    以下是关于“Java中Mybatis,SpringMVC,Spring的介绍及联系”的完整攻略,其中包含两个示例。 1. 前言 Java中的Mybatis、SpringMVC和Spring是三个常用的开发框架,它们各自有不同的作用和特点,但也有联系和互相依赖的地方。本攻略将详细介绍Mybatis、SpringMVC和Spring的作用、特点以及联系。 2. …

    Java 2023年5月16日
    00
  • SpringData JPA实现查询分页demo

    下面我会给出 Spring Data JPA 实现查询分页 Demo 的详细攻略。 1. 添加依赖 在项目的 pom.xml 文件中添加 Spring Data JPA 依赖: <dependency> <groupId>org.springframework.data</groupId> <artifactId&g…

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