2017-08-12 103 views
-2

我有自動裝配的類與所有與它有關的屬性。當收到一個特定類的請求時,我需要返回這些類的對象。一位高級開發人員建議使用構建器模式。然而,我將通過的信息只是要求。我很困惑有人可以幫忙。Java:Builder設計模式

Class DogDetailsProvider{ 

@Autowired 
DogVendor dVendor; 

@Autowired 
DogOwner dOwner; 

@Autowired 
DogHealth dHealth; 
} 


Class CatDetailsProvider{ 

@Autowired 
CatVendor cVendor; 

@Autowired 
CatOwner cOwner; 

@Autowired 
CatHealth cHealth; 
} 

Class ElephantDetailsProvider{ 

@Autowired 
EleVendor eVendor; 

@Autowired 
EleOwner eOwner; 

@Autowired 
EleHealth eHealth; 
} 

回答

1

我認爲你可能需要像Service Locator Pattern這樣的東西。它有助於根據特定的請求決定您必須使用哪個對象。當您想要訪問您的服務時,它可以減少樣板代碼。

首先,你必須創建interface與存取方法,您vendor/owner/health類:

public interface DetailsProvider { 

    Vendor getVendor(); 
    Owner getOwner(); 
    Health getHealth(); 

} 

DogDetailsProviderCatDetailsProviderElephantDetailsProvider必須實現該DetailsProvider接口。你的vendor/owner/health類必須有接口來保持繼承機制。

然後,你必須創建服務定位:

@Service 
public class DetailsProviderLocator { 

    private DetailsProvider dogDetailsProvider; 
    private DetailsProvider catDetailsProvider; 
    private DetailsProvider elephantDetailsProvider; 

    @Autowired 
    public DetailsProviderLocator(
      @Qualifier("DogDetailsProvider") DetailsProvider dogDetailsProvider, 
      @Qualifier("CatDetailsProvider") DetailsProvider catDetailsProvider, 
      @Qualifier("ElephantDetailsProvider") DetailsProvider elephantDetailsProvider) { 
     this.dogDetailsProvider = dogDetailsProvider; 
     this.catDetailsProvider = catDetailsProvider; 
     this.elephantDetailsProvider = elephantDetailsProvider; 
    } 

    DetailsProvider getDetailsProvider(Animal animal) { 
     switch(animal) { 
      case CAT  : return catDetailsProvider; 
      case DOG  : return dogDetailsProvider; 
      case ELEPHANT : return elephantDetailsProvider; 
      default   : throw new IllegalArgumentException("Not allowed!"); 
     } 
    } 

} 

public enum Animal { 

    CAT, DOG, ELEPHANT; 

} 

現在取決於枚舉(可以是任何東西,取決於你的要求)的服務定位器將返回特定的服務。擴展也很容易,由於繼承,您可以創建新的服務併爲枚舉添加新的值。

+0

謝謝你的詳細解答。我是否也必須在dogdetailsprovider等類中加入限定符? – fiddle

+0

是否可以添加示例調用來運行此代碼 – fiddle

+0

您必須添加限定符,因爲您將擁有多個「DetailsProvider」類型的Bean, – ByeBye

0

我需要返回這些類的對象時收到

特定類的請求,這聽起來像是你需要的對象,如類dVendorDogDetailsProvider getter方法。您可以爲getter方法添加樣板代碼,也可以使用lombok的@Getter

構建器模式用於通過在構建器類中公開需要構建的對象的每個屬性的setter方法來創建對象。由於您需要「獲取」而不是「設置」任何數據,因此使用Builder模式根本無濟於事。