黑马程序员技术交流社区

标题: 关于单例设计模式疑问 [打印本页]

作者: zhkqy    时间: 2013-12-7 07:49
标题: 关于单例设计模式疑问
本帖最后由 zhkqy 于 2013-12-7 12:35 编辑

1,单力设计模式只有懒汉式和恶汉式两种吗?单例设计模式测试了不能被继承,父类中构造函数私有化而子类实例对象时还要默认调用父类中的私有化的构造函数,有能继承的单例设计模式么?
作者: Jim-剣◆﹏    时间: 2013-12-7 08:55
单例模式的最大的特点就是构造函数被私有化
基于这一特点,你对比一下,继承的条件是什么...私有的部分不能被继承
所以,怎么会存在同时是单例模式又能被继承的类呢
作者: 25343215    时间: 2013-12-7 08:57
本帖最后由 25343215 于 2013-12-7 09:30 编辑

楼主见下面代码分析:
  1. public class Single_Extends_Test {
  2.     public static void main(String[] args) {
  3.         //Single s = new Single();  这个实例化是要调用Single的构造函数,被privat修饰,不能实例化
  4.         //Single s = new Single2();  这个是调用的Single的子类来实例化
  5.         Single s = new Single(3);  显示的通过另一个构造函数来实例化
  6.         s.print();
  7.     }
  8. }

  9. class Single
  10. {
  11.     private static Single s = new Single();
  12.     private Single(){}
  13.     public static Single getInstance()
  14.     {
  15.         return s;
  16.     }
  17.     public void print()
  18.     {
  19.         System.out.println("饿汉式——单例设计模式");
  20.     }
  21.     Single(int x)  //这个没有定义成私有
  22.     {
  23.         System.out.println("Single");
  24.     }
  25. }

  26. class Single2 extends Single
  27. {
  28.     Single2()
  29.     {
  30.         super(3);   //在继承中,在子类的构造函数中,也会调用父类的构造函数,如果没有指明,
  31.                     //则会是默认的super();
  32.         System.out.println("测试");
  33.     }
  34. }
复制代码
结论:     在单例设计模式中,一般情况下是不能被继承的,因为它的构造函数被私有化了,在子类中的构造函数要调用父类的默认构造函数super()来完成自己的构造函数。最开始的时候是看一看单例设计模式能不能被继承,通过提供其他的构造函数就能够在子类中显示的调用并完成初始化,不过这样一来,这个按照单例设计模式设计的类就偏离了它最初设计的目的。
    不过通过这一测试,知道不能被继承的原因是因为在类中,私有化了构造函数,这样就不能够被继承,因为平常在继承的时候,子类的构造函数都会隐式的调用父类的构造函数。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2