I have a hierarchical data model and am trying to implement their CRUD operations in my Web Application.
Currently I have code inheritance for CRUD operations of my entities (resources) as follows:
ResourceCommonProcedures as a base class and each Resource procedure inheriting the base class.
public class ResourceCommonProcedures {
public Response create(Request request){
Response response = new Response();
int resType = this.getResourceType(request);
ResourceCommonProcedures rp = getResourceController(resType);
response = rp.create(request);
return response;
}
private ResourceCommonProcedures getResourceController(int resourceType){
//..
switch(resourceTypeName){
case Resource1:
return new R1Procedures();
case Resource2:
return new R2Procedures();
case Resource3:
return new R3Procedures();
...............
}
}
Class R1Procedures extends ResourceCommonProcedures{
public Response create(Request request) {
Response response = new Response();
Resource1 resource = (Resource1) request.getContent();
...........
// Converts DB structure to JPA
R1Converter r1Converter = new R1Converter();
Resource1JPA resourceJpa = r1Converter.toJPA(resource);
dao.persist();
return response;
}
}
Class R2Procedures extends ResourceCommonProcedures{
public Response create(Request request) {
Response response = new Response();
Resource1 resource = (Resource2) request.getContent();
// SOME RESOURCE 2 SPECIFIC CODE
...........
// Converts DB structure to JPA
R2Converter r2Converter = new R2Converter();
Resource2JPA resourceJpa = r2Converter.toJPA(resource);
dao.persist();
return response;
}
So currently the base has the controller code which decides which sub class method needs to be called.
So the client will call the base class create method, which will internally get the implementation class and call the specific create method.
Is this design good enough ??
Or should the getResourceController()
must be taken out of base class and put in a separate class ??
Is there a design pattern specific to the case ??
Best Answer
I would go for an abstract generic class :
Some point to consider :