【问题标题】:How to reuse Singleton pattern?如何重用单例模式?
【发布时间】:2015-03-26 17:12:22
【问题描述】:

当我想通过在 Java 语言中使用继承来重用单例模式时,一些有趣的事情让我感到困惑。想和大家分享一下,求大家重用Singleton的解决方案。 我的代码如下。

// Singleton.java
public class Singleton {
    private static Singleton mSingletonInstance;

    protected Singleton() {
        System.out.println("New Singleton Instance.");
    }

    public static Singleton getInstance() {
        if (mSingletonInstance == null)
            mSingletonInstance = new Singleton();

        return mSingletonInstance;
    }
}


// ExtendedSingleton.java
public class ExtendedSingleton extends Singleton{

    private static ExtendedSingleton mExtendedSingleton;

    private ExtendedSingleton() {
        super();
        System.out.println("New Extended Singleton Instance.");
    }

    public static ExtendedSingleton getInstance() {
        if (mExtendedSingleton == null)
            mExtendedSingleton = new ExtendedSingleton();
        return mExtendedSingleton;
    }

    public static void main(String args[]) {
        ExtendedSingleton extendedSingleton = ExtendedSingleton.getInstance();
    }
}

当然,我可以毫无例外地运行这些代码。但我的意图是通过扩展 Singleton 基类来重用 Singleton 模式。但是,我必须重新键入子类中的所有代码,而且我根本没有重用任何东西,这甚至在我需要时编写一个单独的 Singleton 类更好。我真的很困惑。谁能告诉我如何重用单例模式。 随意修正我的英语,我知道我一定有很多错误。

【问题讨论】:

  • 这是单例模式的问题之一:您不能轻易地从单例继承。 (这不是唯一的问题)在我看来,单例在许多情况下是一种反模式。

标签: java design-patterns


【解决方案1】:

如果您想使用 Java 的功能,我会使用 enum。你的课程看起来像

enum Singleton {
    INSTANCE;
    // add fields and methods to taste
}

enum ExtendedSingleton {
    INSTANCE;
    // delegate to Singleton as required.
}

如果你需要继承,你可以使用他们都实现的接口。

【讨论】:

  • 因为我对 Java 非常陌生。能否提供详细信息以便我理解?
【解决方案2】:

单例模式假定一个私有构造函数。你打破了这条规则这就是为什么混乱。不要扩展它

【讨论】:

  • 是的,你是对的。问题是我想通过继承重用单例模式。如果一个类被继承,它必须有一个受保护/公共的构造函数。这让我很困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
相关资源
最近更新 更多