【发布时间】:2009-09-30 15:20:47
【问题描述】:
我需要创建一个负责结果集处理的类,但可能会使用不同的算法来处理该结果集。
我知道以下选项:
1) 使用策略模式,下面是伪代码:
interface Strategy {
processResultSet(ResultSet rs);
}
class StrategyA implements Strategy {
processResultSet(ResultSet rs);
}
class StrategyB implements Strategy {
processResultSet(ResultSet rs);
}
Context 类将包含对 Strategy 的引用,并且 Client 应该通过 Strategy 创建 Context 对象的实现,即
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public doSomething(rs) {
strategy.processResultSet(rs);
}
问题是我不想将策略对象传递给上下文,但我想创建类似 StrategyFactory 的东西,它将负责创建具体的策略实现。它将客户与战略分开 - 这是一个好的设计吗?
它是 Strategy 和 Factory 的混合体,还是实际上只是 Factory 模式?
【问题讨论】:
-
如果您将客户端与其策略实现分开,您的工厂(或者可能是抽象工厂)在尝试实例化对象时如何知道要实现哪个策略?
-
工厂可能不是从客户端获取信息,而是从其他地方(例如配置)获取信息。不知道他的具体实现是不可能的。
-
两者都是@Alcon 的有效点,但如果我们拥有所有详细信息,则更容易提出明智的建议。
-
1) 有一个服务 - 单例。 2) 它包含对 DAO 类的引用——它也是一个单例。 3) 在 DAO 中有一个检索 ResultSet 的方法:ResultSet rs = ps.executeQuery();我想在 DAO 中创建一个适当的策略来处理这个结果集。我无法在 DAO 构造函数中传递此策略,因为它特定于传入请求。在构造函数中传递它会使所有传入请求都相同。
-
所以我决定在 DAO 中创建一个工厂,并在一个方法中创建一个合适的策略(基于请求)并使用它来处理结果集。
标签: java design-patterns oop