需要一种设计模式来删除对象创建中的枚举和 switch 语句

Dan*_*Dan 1 design-patterns object-construction

假设我正在创建一个体育游戏,在这个游戏中,玩家可以玩各种位置,攻击,防御等。所以我从创建一个基类开始:

public abstract class Position
{
 public abstract string Name
 {
  get;
 }
}
Run Code Online (Sandbox Code Playgroud)

和子类...

public class Defender : Position
{
 public override string Name
 {
  get { return "Defender"; }
 }
}
Run Code Online (Sandbox Code Playgroud)

等等。这一切都很好。

但是现在我需要一个函数来创建这些对象。我需要一个按位置创建的函数。因此,一种可能的解决方案是创建所有位置的枚举并将此值传递给一个函数,该函数打开枚举并返回适当的对象。但这会触发我的代码气味警报。这个灵魂将类、枚举和函数内的开关联系在一起:

public static Position GetByType(Types position)
{
 switch(position)
 {
  case Types.Defender:
   return new Defender();
... and further terrible code
Run Code Online (Sandbox Code Playgroud)

我应该考虑什么解决方案?这是哪种设计模式?

Wya*_*ett 5

如果您必须在小范围内执行此操作,那么交换机并不是很糟糕,特别是如果它位于一个地方。

如果您必须在中等规模上执行此操作,您可能需要考虑稍微改进内部结构——Steve Ellinger 的建议是合理的。我个人更喜欢使用IDictionary<MyEnum, Action<T>>其中 Action 返回相关类的新实例的地方。

如果您必须在大规模或可配置的规模上执行此操作,您可能应该查看 IoC 控制器,例如 structuremap 或 ninject 或这些天很酷的孩子们正在玩的任何东西。