我实现了以下策略模式:
public abstract class RetrievalStrategy {
public abstract List<MyObject> retrieve();
}
public class LimitRetrievalStrategy extends RetrievalStrategy {
public int limit;
public LimitRetrievalStrategy(int limit) {
this.limit = limit;
}
public List<MyObject> retrieve() {
// fill up the list and return it, limiting to 'limit' results
return new ArrayList<MyObject>(limit);
}
}
public class SpeedRetrievalStrategy extends RetrievalStrategy {
public int speed;
public SpeedRetrievalStrategy(int speed) {
this.speed = speed;
}
public List<MyObject> retrieve() {
// do something with the speed and return list again
return new ArrayList<MyObject>();
}
}
我的客户端应用程序从用户那里接收到速度或限制(可能还有其他参数)。我想创建一个工厂类,它将根据具有值的参数和没有值的参数返回正确的策略。我不希望客户决定应该返回哪个策略。工厂 createStrategy(params)
方法是否应该对每个参数都有 if
语句,并根据不同的组合(假设还有其他 Strategy 类)返回 Concrete Strategy 类?
执行此操作的正确方法是什么?
最佳答案
哦,RetrievalStrategyFactory
,从哪里开始呢?这听起来像是对 YAGNI 的过度设计.一种方法是创建一个枚举来指定“集合”字段,假设每个参数有一个检索策略,并将其用作工厂。
public enum FieldParameter {
LIMIT {
RetrievalStrategy getRetrivalStrategy(int value) {
return new LimitRetrievalStrategy(value);
}
},
SPEED {
RetrievalStrategy getRetrivalStrategy(int value) {
return new SpeedRetrievalStrategy(value);
}
};
abstract RetrievalStrategy getRetrivalStrategy(int value);
}
那么客户端代码并没有显式指定检索策略,而是在客户端代码通知你的代码用户提供了哪些字段时隐式给出了。
关于java - 使用工厂创建策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9861780/