2011-12-20 33 views
0

我有一个抽象工厂类StudentValidatorFactory,它支持创建(基于指定参数)验证映射必须注入的各种StudentValidator类实例(请参阅下面的代码)。在抽象工厂中插入数据库访问依赖关系是否好?

public class StudentValidatorFactory{ 
    public static final int JUNIOR_STUDENT_TYPE = 1; 

    public static final int SENIOR_STUDENT_TYPE = 2; 

    public StudentValidator createStudentValidator(int studentType) throws StudentValidatorCreationException{ 
      Map<String,ValidationBean> validationMap = readValiationMapFromPersistentOrCachedStorage(studentType); 
      switch (studentType){ 
        case JUNIOR_STUDENT: 
         return new JuniorStudentValidator(validationMap); 
        case SENIOR_STUDENT: 
         return new SeniorStudentValidator(validationMap); 
      } 
    } 
} 

public interface StudentValidator{ 
     void validate(Student student) throws StudentValidationException; 
} 


public class JuniorStudentValidator{ 
    private Map<String, ValidationBean> validationMap;   

    public JuniorStudentValidator(Map<String,ValidationBean> validationMap){ 
     this.validationMap = validationMap; 
    } 

    public void validate(Student student) throws StudentValidationException{ 
     // make use of validation map for apply junior student related validations on the student 
    } 

} 


public class SeniorStudentValidator{ 
    private Map<String, ValidationBean> validationMap;   

    public SeniorStudentValidator(Map<String,ValidationBean> validationMap){ 
     this.validationMap = validationMap; 
    } 


    public void validate(Student student) throws StudentValidationException{ 
     // make use of validation map for apply senior student related validations on the student 
    } 

} 

我的问题是关于StudentValidatorFactory.createStudentValidator(INT studentType)方法是否读取从持久性存储(基于学生型)验证地图应创建方法内完成?否则说,工厂是否应该了解/依赖这些实施细节?

我很感激,如果有创建学生验证器时避免切换(studentType)语句的解决方案 - 我头顶的想法是有一个内部管理的地图并通过通过执行StudentValidator具体类实例化反思。

使用这种技术的优点是验证器更容易测试(通过依赖注入)。

回答

0

提取物readValiationMapFromPersistentOrCachedStorage(studentType)处于分离服务接口StudentValidatorService和注射使用属性或构造器参数的在StudentValidatorFactory服务的实例:

public interface StudentValidatorService { 
    Map<String,ValidationBean> getValidationMap(int studentType); 
} 

public class StudentValidatorFactory{ 
    public static final int JUNIOR_STUDENT_TYPE = 1; 

    public static final int SENIOR_STUDENT_TYPE = 2; 

    public StudentValidatorFactory(StudentValidatorService studentValidatorService) { 
     this.studentValidatorService = studentValidatorService; 
    } 

    public StudentValidator createStudentValidator(int studentType) throws StudentValidatorCreationException{ 
      Map<String,ValidationBean> validationMap = studentValidatorService.getValidationMap(studentType); 
      switch (studentType){ 
        case JUNIOR_STUDENT: 
         return new JuniorStudentValidator(validationMap); 
        case SENIOR_STUDENT: 
         return new SeniorStudentValidator(validationMap); 
      } 
    } 
} 

现在,你可以通过编写数据库支持的StudentValidatorService的实现。或者你可以写一个模拟执行测试。该实现现在与使用情况分离。


要删除开关的情况下,使用一个枚举反其道而行:

public enum StudentType { 
    JUNIOR_STUDENT { 
     public StudentValidator getValidator(Map<String,ValidationBean> validationMap) { 
      return new JuniorStudentValidator(validationMap); 
     } 
    }, 
    SENIOR_STUDENT { 
     public StudentValidator getValidator(Map<String,ValidationBean> validationMap) { 
      return new SeniorStudentValidator(validationMap); 
     } 
    }; 

    public abstract StudentValidator getValidator(Map<String,ValidationBean> validationMap); 
} 

public class StudentValidatorFactory{ 

    public StudentValidatorFactory(StudentValidatorService studentValidatorService) { 
     this.studentValidatorService = studentValidatorService; 
    } 

    public StudentValidator createStudentValidator(StudentType studentType) throws StudentValidatorCreationException{ 
      Map<String,ValidationBean> validationMap = studentValidatorService.getValidationMap(studentType); 
      return studentType.getValidator(validationMap); 
    } 
} 
+0

这是所提供的代码的改进,但它并没有回答这个问题。是否需要依赖工厂进行学生验证检索,还是通过避免学生类型的**开关**提供更好的解决方案?我正在寻找一种方式来实现更松散耦合的功能。 – 2011-12-20 12:51:10

+0

@marius_neo:你没有在你的问题中提及'switch statement issue'。 – home 2011-12-20 13:15:52

+0

@home你说得对。我现在这样做了。 – 2011-12-20 13:39:36