有一个与此类似的代码:
class MyActivity extends Activity {
IStrategy mStrategy;
public void onCreate(Bundle data) {
if (someSpecificCondition) {
mStrategy = new StrategyA();
} else {
mStrategy = new StrategyB();
}
}
public void onUnsupportedState() {
// Will have to switch strategy
mStrategy = new StrategyB();
}
}
我想在这里注入IStrategy。但是我有两个问题:
它是一个接口,具体实现会动态更改。
即使选择了具体的实现方式,也有可能需要重新创建它。
我可以通过创建具有决策逻辑的provider方法来克服(1)(虽然不确定这是否是最佳方法)。
但是我不确定该怎么做(2)。
在这种情况下可以手动创建注入的对象吗?有人看到其他解决方案了吗?
最佳答案
如您所说,向提供者方法添加逻辑并不是一个好的设计决定。在某些情况下,手动实例化对象是有效的,但这只是万不得已。
在这种情况下,最好的方法(IMHO)是注入抽象工厂,该工厂根据需要实例化IStrategy
实现。
在当前情况下,factory方法将需要接受其他参数,使您可以指定感兴趣的策略。虽然这不是世界末日,但实际上由客户控制它使用的策略有点不干净-客户知道有多少种策略。
根据手头的特定用例,您可能能够重构代码并提取出区分客户端策略的逻辑。这样,您的客户将要求IStrategy
,同时完全不了解实现的细节和可用实现的数量。