【问题标题】:How to create multiple instances for Singleton class [duplicate]如何为 Singleton 类创建多个实例 [重复]
【发布时间】:2013-12-26 15:09:08
【问题描述】:

我使用延迟初始化方法创建了一个 Singleton 类。那就是getInstance方法是同步的。但是在不改变设计模式的情况下,有一种方法可以创建 Singleton 类的多个实例。因为改变 Singleton 模式会带来很多架构上的改变。请建议一种创建多个实例的方法。请在 Java 方面提供帮助。

【问题讨论】:

  • 有没有办法在不改变设计模式的情况下创建 Singleton 类的多个实例 我想你在这里回答了你自己的问题。不,没有。
  • 这不是矛盾吗?
  • 只创建一个公共构造函数?
  • ... 或使用不同的对等类加载器加载单例。由类加载器的实例加载的类被认为与由不同类加载器加载的同一类不同。通过这种方式,您可以获得同一个单例实例的多个实例——尽管这与单例模式相矛盾!

标签: java object design-patterns singleton instance


【解决方案1】:

单例模式意味着只允许一个实例。所以不存在创建多个实例的问题。

虽然有一些技巧和变通方法,例如Serializing the Object and De Serializingusing different Class loaders,但它再次违反了创建单例模式的基本原则。

【讨论】:

  • 反射呢?
  • @giorashc 怎么样?
  • @giorashc:这就是他写“允许”而不是“可能”的原因。
  • 但 OP 明确指出他不能碰单例,所以我相信他知道它的定义
  • 无法触摸 Vs。不会碰。
【解决方案2】:

编辑:我没有将其添加为评论所需的声誉,因此将其添加为答案 - 正如 cmets 中指出的那样,它可能是重复的。

稍微研究一下,你就有了:

参考this link

代码

class MySingleton {
    private MySingleton() {
    }
}

class Test {
    public void test() throws Exception {
        Constructor<MySingleton> constructor = MySingleton.class.getConstructor();
        constructor.setAccessible(true);
        MySingleton otherSingleton = constructor.newInstance();
    }
}

【讨论】:

  • 只是复制另一个问题的答案作为您自己的答案在这里是不好的做法。而是在 cmets 中发布链接,以便可以将其作为重复项关闭。
  • 如何将此实现用于带参数的 MySingleton 构造函数。当前方法给出“NoSuchMethodException”。如果我要使用 getDeclaredConstructor 我应该如何使用它?
  • Nopes.. 我得到 NoSuchMethodException... 与“getDeclaredConstructor()”一起工作正常
  • @user2625772 - 构造函数 构造函数 = MySingleton.class.getDeclaredConstructor();
  • 当我使用 getDeclaredConstructor() 而不传递任何参数时,它会给我一个错误。但是当我传递 Singleton 构造函数的参数时,它再次给出错误。如何解决这个问题?
【解决方案3】:

您希望拥有一个类的多个实例,而设计上只能有一个实例。

你可以,但它不再是单例了。将其视为具有多个实例的普通对象并解除限制。如何做到这一点取决于您的用例。

【讨论】:

    【解决方案4】:

    这将取决于类行为。如果实例封装得很好,我猜你可以使用反射重新创建getInstance 方法所做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 2014-08-11
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多