设计模式——单例设计模式

JavaSE进阶——该篇主要讲解Java中的单例设计模式

sum: 保证类中对象的唯一性

单例模式及作用

  • 正常情况下一个类可以创建多个对象
1
2
3
4
5
6
public static void main(String[] args) {
// 正常情况下一个类可以创建多个对象
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
}
  • 如果说有时一个对象就能搞定的事情 , 非要创建多个对象 , 浪费内存!!!

单例设计模式的作用

  • 单例模式,是一种常用的软件设计模式。通过单例模式可以保证项目中,应用该模式的这个类只有一个实例。

    一个类只有一个对象实例

  • 好处 :可以节省内存,共享数据

单例设计模式实现步骤

  1. 将构造方法私有化。(保证外部不能够通过new关键字实例化该类对象)
  2. 在该类内部产生一个唯一的实例化对象,并且将其封装为private static 类型的成员变量(本类中可实例化)。(保证外部可获取该类实例对象)
  3. 定义一个静态方法返回这个唯一对象。

单例设计模式的类型

根据创建对象的时机单例设计模式又分为以下两种:

  1. 饿汉单例设计模式:随着类的加载就把该唯一对象创建完成

  2. 懒汉单例设计模式:当需要使用该实例时候,才会创建

饿汉单例设计模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package modul.single;

/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/5/2 15:14
* @Project JavaCode_SE_Advance
* @Theme 饿汉式单例设计模式
*/

/**
* 1. 构造方法私有化: 保证外部不能够通过new关键字实例化该类
* 3. 设置公开静态方法, 并在该方法返回该类的实现: 保证外部可以访问该实例化类
* 2. 为保证唯一性(共用同一个实例), 将该类的实现作为静态私有成员变量
*/
public class King {
private static King king = new King(); //2.

private King() { // 1.
}

public static King getInstance(){
// return new King(); // 这种就不是共用了
return king; // 3.
}
}


懒汉式单例设计模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package modul.single.demo2;

/**
* @Author EthanLiu 16693226842@163.com
* @Date 2024/5/2 15:31
* @Project JavaCode_SE_Advance
* @Theme 懒汉式单例设计模式
*/
public class King {
private static King king; //保证对象对象唯一性

private King() { //构造方法私有化,保证外部不能够通过new关键字实例化对象
}

public static King getInstance() { //返回该类的实例, 保证外部可以访问实例对象
if (king == null) { //懒汉式: 第一次使用时候才会创建, 后面使用会用第一创建的对象
king = new King();
}
return king;
}
}

问题???

对于多线程访问时候可能出现一定的问题。

解决

加上线程同步即刻。

例如在实例化的方法加上synchronized构成同步方法。

1
2
3
4
5
6
//实现方法,返回该类的实例, 保证外部可以访问实例对象
public static synchronized King getInstance() { // 同步方法
if (king == null) { //懒汉式: 第一次使用时候才会创建, 后面使用会用第一创建的对象
king = new King();
}
return king;