2017-08-12 106 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模式根本无济于事。