在java中使用子类的Singleton

use*_*934 6 java singleton design-patterns

在java中实现单例的最常用方法是使用私有构造函数和表单的公共访问器方法 -

public class Singleton {
    private static Singleton instance = null;
    private Singleton() {

    }
    public static synchronized Singleton getInstance(){
        if (instance == null) {
        instance = new Singleton();         
        } 
        return instance;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,由于构造函数是私有的,因此它可以防止对单例进行子类化.我们有什么方法可以创建一个允许子类化的单例吗?

SLa*_*aks 10

如果你可以继承它,它实际上不是一个单例,因为每个继承的类至少有一个实例.

但是,您可以只创建构造函数protected.


ysh*_*vit 9

当你有一个class A extends B,实例A本质上是"包括"的实例B.因此,继承的概念与单身模型相反.

根据您的需要,我会考虑使用合成/委托.(A会引用单例,而不是扩展它的类).如果由于某种原因需要继承,请使用Singleton方法创建接口,让Singleton实现该接口,然后让另一个类也实现该接口,并委托单例执行相关方法.