设计流程
需求:
这个类在程序中有且只有一个类对象。
方案:
程序中只调用一构造函数。
问题:
构造函数不能去约束用户使用,只调用一次的构造函数,很不安全,无法限制别人调用次数。
方案:
构造函数私有化,用 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); } }
|