是否可以将继承应用于Singleton类?

bra*_*boy 21 java singleton design-patterns

今天我在面试中遇到了一个问题.是否可以在Singleton类上应用继承概念?我说因为构造函数是私有的,所以我们不能扩展那个Singleton类.

他问我的下一件事是在Singleton类上应用继承.因此,我将Singleton的构造函数视为受保护的思想,即child的构造函数也受到保护.但我错了,孩子可以有一个等于或高于此的修饰符.

所以,我让他给出一个关于这种情况的真实世界的例子.他无法给我一个,并说我无法提出问题,并希望我告诉他们这种情况是否可能.

我有点空白.我的问题是,

  • 这可能吗?
  • 即使有可能,它的用途是什么?
  • 现实世界的情景需要这样的用途?

b.r*_*oth 12

是的,这在技术上是可行的,因为singleton是一种设计模式,而不是一种可能具有继承限制的语言结构.我只是重新实现public [Object] getInstance()子类中的方法(见下文).

而且,是的,单身人士也可以从继承中受益,因为他们可能与其他单身人士分享相似但不具有识别性的行为.

public class ParentSingleton {

    private static ParentSingleton instance;

    protected ParentSingleton() {
    }

    public static synchronized ParentSingleton getInstance() {
       if (instance == null) {
          instance = new ParentSingleton();
       }

       return instance;
    }

    public int a() {
       // (..)
    }       
}

public class ChildSingleton extends ParentSingleton {

    private static ChildSingleton instance;

    public static synchronized ParentSingleton getInstance() {
       if (instance == null) {
          instance = new ChildSingleton();
       }

       return instance;
    }       
}
Run Code Online (Sandbox Code Playgroud)

编辑:作为的Eyal在下面他的评论中指出,在超类的构造函数必须作出保护(而不是私人的),否则它不会是子类和代码甚至不会编译可见.

  • @Eyal:受保护的构造函数*是严格的设计模式 - 查找它. (3认同)
  • "其他单身人士"是矛盾的.如果它们都扩展了相同的(单例)基类,那么它们应该只有一个. (2认同)

Mic*_*rdt 12

引用圣经:

当唯一实例应该通过子类化可扩展时使用Singleton模式,并且客户端应该能够使用扩展实例而无需修改其代码.

Singleton模式有几个好处:[...] 3.允许改进操作和表示.Singleton类可以是子类,并且使用此扩展类的实例配置应用程序很容易.您可以使用运行时所需的类实例配置应用程序.

至于如何实现这一点:本书提出了几种方法,其中最复杂的是一个注册表,其中的实例按名称查找.

  • 这不是单身类.它是单例模式的实现.例如,如果程序员遵守规则,则注册表方法仅提供单例行为.如果他们不遵守只能从注册表获取实例的规则,则模式会中断.当他们谈到单身人士设计模式和单身人士阶级之间的区别时,这就是其他答案/评论的含义. (2认同)

Ste*_*n C 10

您可以使用一组公共属性和方法创建一个抽象基类,然后创建一些子类作为单例类.那就是"以一种有用的方式应用继承概念".

但是你不能做的是创建一个严格实现的单例类的子类.如果声明单例类构造函数作为private子类将无法编译.如果您使用其他访问权限声明它,则可以在另一个类中使用构造函数来创建多个实例...因此,它不是严格意义上的单例.如果你将单例声明为abstract,则根本无法实例化...因此它不是单例.