Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用工厂创建策略_Java_Factory Pattern_Strategy Pattern - Fatal编程技术网

Java 使用工厂创建策略

Java 使用工厂创建策略,java,factory-pattern,strategy-pattern,Java,Factory Pattern,Strategy Pattern,我实施了以下战略模式: public abstract class RetrievalStrategy { public abstract List<MyObject> retrieve(); } public class LimitRetrievalStrategy extends RetrievalStrategy { public int limit; public LimitRetrievalStrategy(int limit) {

我实施了以下战略模式:

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>();
    }
}
公共抽象类检索策略{
公共摘要列表检索();
}
公共类LimitRetrievalStrategy扩展了RetrievalStrategy{
公共整数限制;
公共限制检索策略(整数限制){
这个极限=极限;
}
公共列表检索(){
//填写列表并返回,限制为“限制”结果
返回新的ArrayList(限制);
}
}
公共类SpeedRetrievalStrategy扩展了RetrievalStrategy{
公共交通速度;
公共速度检索策略(国际速度){
速度=速度;
}
公共列表检索(){
//再次对速度和返回列表进行操作
返回新的ArrayList();
}
}
我的客户端应用程序从用户处接收速度或限制(可能还有其他参数)。我想创建一个factory类,它将根据具有值的参数和不具有值的参数返回正确的策略。我不想让客户决定应该返回哪种策略。工厂
createStrategy(params)
方法是否应该为每个参数使用
if
语句,并根据不同的组合(假设有其他策略类)返回具体的策略类?
正确的方法是什么?

否,方法签名中的返回值应该是公共接口或基类


工厂必须有if测试来决定要返回的具体类型,但这是不可避免的,除非您可以根据封装参数组合的复合键类创建一个返回具体实例的映射。

哦,
RetrievalStrategyFactory
,从哪里开始?这听起来像是对一个公司的过度设计。一种方法是创建一个枚举来指定“set”字段,假设每个参数有一个检索策略,并将其用作工厂

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);
}

然后,客户机代码没有显式指定检索策略,但当客户机代码通知您的代码用户提供的字段时,会隐式指定检索策略。

如果您需要扩展工厂的功能,您需要一个抽象工厂。这是一个工厂的工厂。一个抽象工厂可以有许多插件工厂,它们可以遵循一种策略来确定使用哪个工厂


这通常是不必要的复杂,您可以稍后添加,因此这不是您需要做的事情,以防您需要它。

我会这样做。你的疑问是什么?TBH,让工厂使用“is参数集”启发式来猜测使用哪种策略听起来像是一场非OO维护噩梦。如果你有两个使用完全相同参数的策略呢?你将无法使用这种工厂设计。如果他们设置了相同的参数,那么应该返回相同的策略。所以你基本上是说检索策略是由设置的参数组合定义的,所以我提到的场景不可能发生,根据假设?这就是我要说的,是的。可能有多个值,一个策略可能需要多个参数。