设计模式

单例设计模式

方案一

  1. 提供私有化的构造方法
    目的:防止外界随意调用创建对象

  2. 创建私有化的本类对象
    目的:防止外界直接获取创建的对象

  3. 提供公共全局的访问点,供外界调用获取对象
    可以通过全局访问点获取单例程序对象,获取的对象即为单例的。

示例代码
  1. package cn.tedu.design;
  2. /**
  3. * 测试单例设计模式方案1
  4. */
  5. public class TestSingle1 {
  6. public static void main(String[] args) {
  7. /*
  8. 可以通过全局访问点获取单例程序对象,获取的对象即为单例的。
  9. */
  10. MySingle s1 = MySingle.getSingle();
  11. MySingle s2 = MySingle.getSingle();
  12. //测试打印的是否为同一个对象
  13. System.out.println(s1);
  14. System.out.println(s2);
  15. System.out.println(s1 == s2);
  16. }
  17. }
  18. /*
  19. 1.提供私有化的构造方法
  20. 2.创建私有化的本类对象
  21. 3.提供公共全局的访问点,供外界调用获取对象
  22. */
  23. class MySingle{
  24. /*
  25. 1.提供私有化的构造方法
  26. 目的:防止外界随意调用创建对象
  27. */
  28. private MySingle(){}
  29. /*
  30. 2.创建私有化的本类对象
  31. 目的:防止外界直接获取创建的对象
  32. */
  33. private static MySingle single = new MySingle();
  34. /*
  35. 3.提供公共全局的访问点,供外界调用获取对象
  36. */
  37. public static MySingle getSingle(){
  38. //返回创建的对象
  39. return single;
  40. }
  41. }

方案二

思想:不在第一时间创建对象,而是,加载时才会创建

过程:

  1. 私有化构造方法
  2. 定义一个静态私有的成员变量,不创建对象,只有在加载时在创建。
  3. 提供公共的全局访问点

    1. 做判断,判断成员变量地址值是否为null,若为null则没有创建对象,需要创建一个唯一的对象。
    2. 若地址值不为null,代表已经创建过对象,则直接返回之前创建的对象地址值。

示例代码
  1. package cn.tedu.design;
  2. /**
  3. * 测试单例设计模式方案2
  4. */
  5. public class TestSingle2 {
  6. public static void main(String[] args) {
  7. MySingle2 s1 = MySingle2.getSingle2();
  8. MySingle2 s2 = MySingle2.getSingle2();
  9. System.out.println(s1);
  10. System.out.println(s2);
  11. }
  12. }
  13. class MySingle2{
  14. /*
  15. */
  16. private MySingle2(){}
  17. static MySingle2 single2;
  18. public static MySingle2 getSingle2(){
  19. /*
  20. 创建对象前,先判断引用型变量是不是null,为null需要创建对象反之,直接返回
  21. */
  22. if (single2 == null){
  23. single2 = new MySingle2();
  24. }
  25. return single2;
  26. }
  27. }