Java 扩展单例是错误的吗?

Java 扩展单例是错误的吗?,java,singleton,Java,Singleton,Singleton的概念(至少在java中)说它必须用私有构造函数实现,对吗? 例: 然而,如果我们忽略这个事实,用一个受保护的构造函数来做,他会不再是一个单例吗?我在网上看到了一些关于这个场景的例子 public class Singleton { private static Singleton singleton; protected Singleton() { } public synchronized static Singleton getIns

Singleton的概念(至少在java中)说它必须用私有构造函数实现,对吗? 例:

然而,如果我们忽略这个事实,用一个受保护的构造函数来做,他会不再是一个单例吗?我在网上看到了一些关于这个场景的例子

public class Singleton {

    private static Singleton singleton;

    protected Singleton() {
    }

    public synchronized static Singleton getInstance() {

    if (singleton == null) {

        int tipoDoSingletonParaInstanciar = leUmArquivoTexto();

        if (tipoDoSingletonParaInstanciar == 1) {
        singleton = new SingletonSubclasse1();
        } else if(tipoDoSingletonParaInstanciar == 2) {
        singleton = new SingletonSubclasse2();
        } else {
        singleton = new Singleton();
        }
    }

    return singleton;
    }

    public void metodoQuePodeSerSobrescrito() {
    System.err.println("Singleton.metodoQuePodeSerSobrescrito()");
    }
}
如果受保护的构造函数本身不是问题。。。继承一个单例并不意味着它的子类可以创建多个父实例?这不是打破了这个概念吗


有没有可能继承一个单例而不破坏它的概念(阻塞)?

通过创建多个对象,这意味着它不再是单例。 如果你这样做,你就打破了单身的概念


当类是抽象类时,应该使用受保护的构造函数。在这种情况下,您不希望从类中实例化对象,而只希望使用它从中继承。

通过创建多个对象,这意味着它不再是单例对象。 如果你这样做,你就打破了单身的概念


当类是抽象类时,应该使用受保护的构造函数。在这种情况下,您不希望从类实例化对象,而只希望将其用于从继承。

Singleton
应该是
final
。如果创建
Singleton
的子类,则它是-a
Singleton
。所以你有两个。这不是一个
单例
。单例和只创建一个实例的对象之间有一个重要的区别。您正在描述后者。
Singleton
应该是
final
。如果创建
Singleton
的子类,则它是-a
Singleton
。所以你有两个。这不是一个
单例
。单例和只创建一个实例的对象之间有一个重要的区别。你在描述后者。在受保护的构建器的情况下,你说?当在singleton中有受保护的构造函数时?在受保护的构建器的情况下,你说?当在singleton中有受保护的构造函数时
public class Singleton {

    private static Singleton singleton;

    protected Singleton() {
    }

    public synchronized static Singleton getInstance() {

    if (singleton == null) {

        int tipoDoSingletonParaInstanciar = leUmArquivoTexto();

        if (tipoDoSingletonParaInstanciar == 1) {
        singleton = new SingletonSubclasse1();
        } else if(tipoDoSingletonParaInstanciar == 2) {
        singleton = new SingletonSubclasse2();
        } else {
        singleton = new Singleton();
        }
    }

    return singleton;
    }

    public void metodoQuePodeSerSobrescrito() {
    System.err.println("Singleton.metodoQuePodeSerSobrescrito()");
    }
}