如何避免子类的工厂方法中的switch-case

假设我们有一系列类(卡片,为了它),我们需要根据一些标识符实例化它们。 工厂方法如下所示:

public Card GetCard(int cardNumber) { switch(cardNumber) { case 13: return new King(); case 12: return new Queen(); case 11: return new Jack(); } //... } 

我想要的是避免这种switch 。 为什么? 也许我想在function中重复使用这种比较。

我想出的是这样的:

 private Dictionary cardTypes = { {13, typeof(King)}, {12, typeof(Queen)}, {11, typeof(Jack)} }; public Card GetCard(int cardNumber) { var cardType = cardTypes[cardNumber]; var instance = Activator.CreateInstance(cardType); return (Card)instance; } 

但是,这个解决方案使用昂贵的reflection,并且当你有多个“标识符”时也会出现问题(例如1和14都给出了Ace – 我应该在字典中添加2个键吗?)。

这种情况下的最佳做法是什么?

您可以存储Func ,而不是将类型存储在字典中:

 private Dictionary> cardFactories = { { 13, () => new King() }, // etc } public Card GetCard(int cardNumber) { var factory = cardFactories[cardNumber]; return factory(); } 

在卡片的情况下,我可能会让它们一开始就是不可变的,只是用卡片自己填充字典,但这是另一回事:)