Plain's Blog

休想打败我的生活🔥

  1. 1. 简介
  2. 2. 实现思路
  3. 3. 实现方式
    1. 3.1. 饿汉式
    2. 3.2. 懒汉式(线程不安全)
    3. 3.3. 懒汉式(线程安全,同步方法)
  4. 4. 问题
    1. 4.1. 1. 为什么要使用单例模式,它有什么好处?
    2. 4.2. 2. 能不能使用构造方式私有化加上静态方法来代替单例呢

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

简介

单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。

许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

实现思路

  • 声明一个本类对象

  • 构造方法私有化

  • 给外部提供一个静态方法获取对象实例 getInstance()

实现方式

饿汉式

在类被加载后,对象被创建,到程序结束后释放

1
2
3
4
5
6
7
8
9
10
class Singleton_1 {
private final static Singleton_1 s = new Singleton_1();

private Singleton_1() {
}

public static Singleton_1 getInstance() {
return s;
}
}

懒汉式(线程不安全)

在第一次调用getInstance()方法时,对象被创建,到程序结束后释放

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Singleton_2 {

private static Singleton_2 s;

private Singleton_2() {
}

public static Singleton_2 getInstance() {
if (s == null) {
s = new Singleton_2();
}
return s;
}
}

懒汉式(线程安全,同步方法)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 懒汉式, 线程安全
*/

class Singleton_3 {

private static Singleton_3 s;

private Singleton_3() {
}

public static synchronized Singleton_3 getInstance() {
if (s == null) {
s = new Singleton_3();
}
return s;
}
}

还有几种,以后学习到会添加

问题

1. 为什么要使用单例模式,它有什么好处?

  • 在设计一些工具类的时候(通常工具类,只有方法,没有属性)

  • 工具类可能被频繁调用

目的是为了节省重复创建对象带来的内存消耗,从而提高效率

2. 能不能使用构造方式私有化加上静态方法来代替单例呢

两种方式各有特点,在Java的JDK中Math类就是静态类来实现的,而java.lang.Runtime是一个单例的类

由于是静态方法,程序运行时就已经被加载到静态方法区中,这样调用的时候就可以直接从静态方法区中读取,速度很快,不过占用内存较高。

单例中的方法,归根结底还是普通方法,方式的执行需要依赖对象,方法运行时需要进栈,运行结束后出栈,这样在内存中只占一个对象的空间,对内存比较节省

如果是一个非常重的对象,单例可以懒加载,但是静态类没有这样的优势,并且非常热切的加载。

使用单例,可以通过继承和多态扩展基类,实现接口和更有能力提供不同的实现,如果我们讨论java.lang.Runtime,在Java中它是单例,调用getRuntime()方法,会基于不同的JVM返回不同的实现,但也保证了每个JVM中实有一个实例,如果java.lang.Runtime是一个静态类,不太可能因不同的JVM返回不同的实现。

这就是Java中单例与静态类的区别,当你需要一个全OO能力的对象时,选择单例,如果仅仅是将一些静态方法预售,使用静态类。

本文作者 : Plain
This blog is under a CC BY-NC-SA 3.0 Unported License
本文链接 : https://plain-dev.com/design-patterns-singleton/

本文最后更新于 天前,文中所描述的信息可能已发生改变