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

时间:2016-06-30 10:19:23

标签: java singleton

我想设计一个应该返回某个第三方对象的单例的类。 例如,我想创建一个第三方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;
}

}

请帮助我,这是一个合适的单身人士

3 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您希望拥有第三方类的单个实例。首先,通过包装类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;
 }
}

答案 1 :(得分:0)

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

public class A {

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

private A(){}

public static B getB(){

   return BInstanceHolder.BInstance;

}

}

答案 2 :(得分:0)

如果你只想要一份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的唯一实例。