java - 使用工厂创建策略

标签 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) {
        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/

相关文章:

java - 使用 Gradle 的重复类输出 jar

php - 定义 Magento 类名称的字符串的名称

design-patterns - 桥接模式和策略模式有什么区别?

java - wildfly - 将 CDI 与 POJO 结合使用

java - 两个连续的代码块 {}{} 有什么作用?

java - 使用每个子类方法创建工厂对象

C# 工厂方法与泛型强制转换为接口(interface)

c# - 多策略设计模式

Java - 解决多个条件逻辑的设计模式

java - 使用Jlink时如何安装jwdp依赖