簡體   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