C# 实施战略模式。我必须';新建';每次?

C# 实施战略模式。我必须';新建';每次?,c#,strategy-pattern,C#,Strategy Pattern,我正在尝试实施以下内容,这是我实施的一部分: public List<string> GetOrderedEmployeeNames(IOrderByStrategy strategy) { return GetEmployeeFullNames().OrderBy(strategy.Order); } “每次更新”策略是正确的方法还是我实现的不正确?如果实现IOrderByStrategy的类没有任何状态(即每次的行为都相同),那么您最好将其存储在某个字段中,以避免重新创建

我正在尝试实施以下内容,这是我实施的一部分:

public List<string> GetOrderedEmployeeNames(IOrderByStrategy strategy)
{
   return GetEmployeeFullNames().OrderBy(strategy.Order);
}

“每次更新”策略是正确的方法还是我实现的不正确?

如果实现
IOrderByStrategy
的类没有任何状态(即每次的行为都相同),那么您最好将其存储在某个字段中,以避免重新创建它


这就是说,
new
是一个非常有效的操作,如果您不在一个紧密的循环中调用它,那么继续执行您正在执行的操作可能会更简单。

不一定,尽管创建对象可能不会有任何影响,因为我假设它们主要是方法,并且不包含大量数据

一些备选方案:

  • 实现一个
    StrategyFactory
    ,创建新实例或保存对flyweights(由某个键索引的小对象,如字符串)的引用
  • 以单例的形式实现这些策略,但是如果有很多策略,那么这可能会比您需要的开销更大
如果策略具有相同的行为,则可以存储属性。如果没有,则可以使用参数创建对象

    private IOrderByStrategy orderByStrategy;
    public IOrderByStrategy OrderByStrategy
    {
         get
         {
            if(orderByStrategy != null)
               return orderByStrategy;
            else
               return new OrderByStrategy();
         }
    }
var employees = GetOrderedEmployeeNames(OrderByStrategy);
第二种情况:

var employees = GetOrderedEmployeeNames(new OrderByFamilyName("familyname","DESC"));
是的,它们只是表情的
var employees = GetOrderedEmployeeNames(new OrderByFamilyName("familyname","DESC"));