1 /* 2 * 设计模式:对问题行之有效的解决方式。其实它是一种思想。 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性。 6 * 7 * 必须对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。 8 * 9 * 如何保证对象唯一性呢? 10 * 1,不允许其他程序用new创建该类对象。 11 * 2,在该类创建一个本类实例。 12 * 3,对外提供一个方法让其他程序可以获取该对象。 13 * 14 * 步骤: 15 * 1,私有化该类构造函数。 16 * 2,通过new在本类中创建一个本类对象。 17 * 3,定义一个公有的方法,将创建的对象返回。 18 */ 19 //饿汉式 (开发) 20 class Single{//类一加载, 对象就已经存在了。 21 static Single s = new Single(); 22 private Single() {} 23 public static Single getInstance() { //String name //给一个方法 可控 24 return s; 25 } 26 } 27 //懒汉式 存在一些问题:如果后期被多线程并发访问时可能保证不了对象唯一性,存在安全隐患。 (面试会问) 28 class Single2{//类加载进来,没有对象,只有调用了getInstance方法时,才会创建对象。 29 //延迟加载形式。 30 private static Single2 s = null; 31 32 private Single2() {} 33 34 public static Single2 getInstance() { 35 if(s == null) { 36 s = new Single2(); 37 } 38 return s; 39 } 40 } 41 public class SingleDemo { 42 public static void main(String[] args) { 43 Single ss = Single.getInstance(); 44 Single s1 = Single.getInstance(); 45 Single s2 = Single.getInstance(); 46 System.out.println(s1 == s2); 47 //Single ss = Single.s; //也可以但是不可控。 48 Test t1 = Test.getInstance(); 49 Test t2 = Test.getInstance(); 50 t1.setNum(10); 51 t2.setNum(20); 52 System.out.println(t1.getNum()); 53 System.out.println(t2.getNum()); 54 } 55 } 56 class Test{ 57 private int num; 58 //保证唯一性加入下面三句; 59 private static Test t = new Test(); 60 private Test() {} 61 public static Test getInstance() { 62 return t; 63 } 64 public void setNum(int num) { 65 this.num = num; 66 } 67 public int getNum() { 68 return num; 69 } 70 71 }