使用工厂方法模式

Using FactoryMethod pattern

我有两个独立的实体:

public enum Rule implements Validatable, StringRepresentable{ 
     //...
}

public inteface Filter extends Validatable, StringRepresentable{
    //...
}

哪里

public inteface Validatable{
    public GenericValidator getValidator();
}

public interface StringRepresentable{
    public String getStringRepresentation();
}

GenericValidator 是一个抽象 class 有许多子 classes 我不希望用户直接访问。我应该如何更好地处理这些事情?

我不明白什么时候创建一个 class 赞

比较好
public class ValidatorFactory{
    public Validator getRuleValidator(Rule r){ ... }
    public Validator getFilterValidator(Filter f){ ... }
}

而不是像我之前展示的那样实现 Validatable 接口。

有人不能解释一下我怎样才能做出正确的决定吗?什么潜在情况需要实施 FactoryMethod 一个糟糕的决定,什么时候才是真正好的决定?

更新:

public interface Validator{
    public ErrorCode validate();
}

public abstract class GenericValidator implements Validator{
   //...
}

ErrorCode class 封装了验证结果(null 如果验证成功完成)。

我在两种主要情况下使用此模式:

A) 对象的构建并非微不足道 - 我不相信 API 的用户能够正确地完成它

B)实现比较多,想自己选一个合适的

在这两种情况下,我想隐藏实现只是因为用户不知道使用哪一个 and/or 不知道如何正确构造它。

始终以简单易用为目标。问自己这些问题:

  1. API容易理解吗?
  2. API easy/fun 可以用吗?
  3. 万无一失吗? (我必须非常努力才能滥用它)

单一职责原则

Validator 的构造是一种责任,Filter 或Rule 可能承担另一种责任。这意味着我们应该拆分它,通常我们这样做是将实例化逻辑封装在工厂模式中。

另请注意,实现 Validatable 意味着成为 ValidatorFactory。我的答案是 - 结合两种解决方案:

public class FilterImpl implements Filter {
    private final Validator validator;

    public FilterImpl(Validator validator) {
        this.validator = validator;
    }

    @Override
    public getValidator() {
         return this.validator;
    }

    //...
}

public class FilterFactory {
    private final ValidatorFactory validatorFactory = new ValidatorFactory();

    public Filter createFilter() {
        return new FilterImpl(valdatorFactory.createFilterValidator());
    }
}

这称为依赖注入。

验证器界面可能如下所示:

public interface Validator {
   public int validate();
}

过滤器界面如下所示:

public interface Filter {
  public String getParameters();   // some related methods..
  public int currentLength();
  ....
}

规则接口:

public interface Rule {
  public String getRule();
}

FilterValidator 可以如下所示:

public class FilterValidator implements Validator{

private Filter f;

public FilterValidator(Filter f){
    this.f = f;
}

@Override
public int validate() {
    // validate f and return errorcode
    String params = f.getParameters();
    int strLength = f.currentLength();
    .....

    return 0;
 }

}

创建工厂更好地隐藏验证器的内部逻辑。

public class ValidatorFactory {

public Validator getRuleValidator(Rule r){
    return null;
}

public Validator getFilterValidator(Filter f){
    FilterValidator fv = new FilterValidator(f);
    return fv;
}
}

现在客户端将像这样调用这个工厂:

public class ClientDemo {

  private class MyFilter implements Filter{

    private String filterInput;
    public MyFilter(String input){
        this.filterInput = input;
    }

    @Override
    public String getParameters() {
        return null;
    }

    @Override
    public int currentLength() {
        return this.filterInput.length();
    }

}

    public void testValidators(){

      ValidatorFactory factory = new ValidatorFactory();
      Validator v = factory.getFilterValidator(new MyFilter("filter string goes here..."));
      v.validate();
     }
 }
}

通过接口 Rule、Filter,您可以从客户端强制执行您希望的行为。然后客户端可以从工厂获取实例并将 rule/filter 个实例传递给它进行验证。