gpt4 book ai didi

c# - 如何实现策略模式的创建/工厂关注点?

转载 作者:行者123 更新时间:2023-11-30 20:46:05 25 4
gpt4 key购买 nike

  1. 问题

我有一个类型的全名,例如“StrategyA”,我想获取分配给其接口(interface)“IStrategy”的新策略(值),如何获取?

  1. 我有什么尝试

我试过这个:

IStrategy strategy;
if (strategyName == "StrategyA")
{
strategy = new StrategyA(value);
}
else if(strategyName == "StrategyB")
{
strategy = new StrategyB(date);
}
...

但是当我创建一个新策略时,我必须在代码中添加另一个分支,我认为这是一种糟糕的代码风格。有没有更好的方法来解决这个问题?

最佳答案

以下是一些选项,排名不分先后:

(A) 如果你的策略名称是一个完整的 CLR 类型名称(或者一个完整的类型名称可能由约定决定),并且每个策略都有公共(public)的构造函数参数,你可以使用反射找到类型并创建一个实例。

Type strategyType = Type.GetType(strategyName)
IStrategy instance = (IStrategy)Activator.CreateInstance(strategyType, paramArray);

请注意,如果您不信任 strategyName 输入,则不应使用此方法,否则您可能会创建意外类型的实例。

(B) 您可以使用字典创建从策略名称到工厂委托(delegate)的映射。如果使用各种构造函数,或者工厂来来去去,这种方法可能很有用。

Dictionary<string, Func<IStrategy>> factories = new Dictionary<string, Func<IStrategy>>();
//register various factories
factories.Add("StrategyA", () => new StrategyA(value));
factories.Add("StrategyB", () => new StrategyB(date));

Func<IStrategy> factory;
if(factories.TryGetValue(strategyName, out factory))
{
IStrategy instance = factory();
}

(C) 您可以依赖任意数量的 IoC 容器,例如 Autofac 和 ask for the corresponding IStrategy implementation .

(D) 另一种有时使用的相关模式依赖于 IStrategy 的实现来检查适用性并返回第一个适用的模式。当调用者不知道选择哪种策略时,这会很有用。

List<IStrategy> strategies = new List<IStrategy>();
//register strategies (highest priority first)
strategies.Add(new StrategyA(value));
strategies.Add(new StrategyB(value));
//alternatively, you might resolve IEnumerable<IStrategy> from your IoC container

foreach(IStrategy strategy in strategies)
{
if(strategy.IsApplicable(someInput)) return strategy;
}

关于c# - 如何实现策略模式的创建/工厂关注点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27415070/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com