2017-08-12 8 views
-2

私は、それに関連するすべての属性を持つautowiredクラスを持っています。特定のクラスのリクエストを受け取ったときに、これらのクラスのオブジェクトを返す必要があります。シニア開発者はビルダーパターンの使用を提案しています。しかし、私が渡すべき情報はちょうど要求です。私は混乱している誰かを助けることができます。Java:Builder Design Pattern

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のようなものが必要だと思います。特定の要求に応じて、どのオブジェクトを使用するかを決定するのに役立ちます。あなたのサービスにアクセスしたいときに定型コードを減らします。

は、まず、あなたのvendor/owner/healthクラスにアクセサメソッドを持つinterfaceを作成する必要があります。

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; 

} 

は今列挙型に応じて、あなたのサービスロケータは、特定のサービスを返します(、何もすることができますこれはあなたの要求に依存します)。継承のために新しいサービスを作成し、新しい値をenumに追加するだけで、拡張も簡単です。

+0

詳細な回答ありがとうございます。私はdogdetailsproviderなどのクラスにも修飾子を入れなければなりませんか? – fiddle

+0

このコードを実行するためのサンプル呼び出しを追加できます – fiddle

+0

修飾子を追加する必要があります。これは、 'DetailsProvider'型の複数のBeanを持つためです。 – ByeBye

0

私は特定のクラスの要求が

を受信したときに、このようなDogDetailsProviderのようなクラスでdVendorなどのオブジェクトのgetterメソッドを必要とするように、この音をこれらのクラスのオブジェクトを返す必要があります。 getterメソッドの定型コードを追加するか、lombokの@Getterを使用することができます。

ビルダーパターンは、ビルドする必要のあるオブジェクトの各属性のビルダークラスにセッターメソッドを公開することによってオブジェクトを作成するために使用されます。あなたが "取得"し、任意のデータを "設定"する必要はないので、Builderパターンを使用することはまったく役に立ちません。