Java-单例模式

设计流程

需求:

​ 这个类在程序中有且只有一个类对象。

方案:

​ 程序中只调用一构造函数。

问题:

​ 构造函数不能去约束用户使用,只调用一次的构造函数,很不安全,无法限制别人调用次数。

方案:

​ 构造函数私有化,用 private 修饰

问题:

​ 构造函数是私有化了,安全了,但是类外却无法调用了。

方案1:

​ 给函数加上 static 修饰

问题:

​ 这里的 static 不能用来修饰构造函数,违背了构造函数的原理【没有对象】

方案2:

​ 只需新建一个方法,用 static 修饰,方法中调用构造方法,返回值就是需要的对象。

问题:

​ 发现封装了,创建的对象还是不一样。

方案:

  • 使用一个静态的成员变量来保存 创建过的对象的首地址
  • 是不在类外使用的,所以直接 private 修饰
  • 需要保存类对象的地址,持久化数据,用 static 修饰
  • 数据类型就是对象,初始值设置为 null

问题:

​ 成员变量私有化了,静态也用了,数据类型没错,但是每次还是两个对象

方案:

​ 对于保存的地址进行判断,如果为 null ,创建对象,返回保存的地址,如果不是 null ,返回保存的地址。

实例:

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
28
29
30
31
32
33
class Single {
int id;

private static Single s = null;

private Single(int id) {
this.id = id;
}
public static Single getInstance(int id) {
if(s == null) {
s = new Single(id);
}
return s;
}
}

public class Demo6 {
public static void main(String[] args) {
Single single = Single.getInstance(5);
System.out.println(single);

Single single2 = Single.getInstance(59);
System.out.println(single2);

Single single3 = Single.getInstance(5);
System.out.println(single3);

Single single4 = Single.getInstance(59);
System.out.println(single4);

System.out.print(single4.id);
}
}