浅析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技术站