繁体   English   中英

Singleton类返回两个不同的单例对象

[英]Singleton class return two different singleton objects

我想设计一个应该返回某个第三方对象的单例的类。 例如,我想创建一个第三方B类对象的单例。 以下是我的设计。

public class A{

private static A A = null;
private static B B = null;

private A() {

    B = code to instantiate B Object;

}

public static synchronized A getAInstance() {

    if(A ==null){
        synchronized(A.class){
            if(A == null){
                 A = new A();
            }
        }
    }
    return A;
}
public B getB(){
    return B;
}

}

能帮到我,请问这是一个合适的单身人士

如果我正确理解您的问题,您希望拥有第三方类的单个实例。 首先,通过包装类obj(敏捷软件工艺第8章的清洁代码手册)访问第三方obj是一个很好的做法,在你的情况下,类b由类a包装。 为了创建类b的单个实例,你可以将它作为类a的实例变量,然后使类成为单例,代码如下

Public class A{

private static A A = null;
private B B = null;

private A() {
  B = code to instantiate B Object;
 }

public static synchronized A getAInstance() {

if(A ==null){
    synchronized(A.class){
        if(A == null){
             A = new A();
        }
    }
  }
  return A;
 }

public B getB(){
  return B;
 }
}

你可以简单地拥有这种结构。 不需要显式同步,只需将其留给JVM即可。

public class A {

 private static class BInstanceHolder {
    B BInstance = new B();
}

private A(){}

public static B getB(){

   return BInstanceHolder.BInstance;

}

}

如果你只想要一份B副本,就这样做吧! 你甚至不需要A类单身人士。所以你可以尝试:

public final class A{

  private A(){}

  private static B instance;

  static{
    instance = code to instantiate B Object
  }

  public static synchronized B getInstance() {
      return B;
  }
}

静态块将在首次提到Class时创建B的实例,并将实例化该实例。 构造函数将阻止A的生成,但您仍然可以访问B的唯一实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM