c# - How to avoid switch-case in a factory method of child classes -
lets have family of classes (cards, sake of it), , need instantiate them based on identifier. factory method this:
public card getcard(int cardnumber) { switch(cardnumber) { case 13: return new king(); case 12: return new queen(); case 11: return new jack(); } //... }
what want avoid switch
. why? maybe want reuse comparison in feature.
what came this:
private dictionary<int, type> 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; }
however, solution uses reflection expensive, , problematic when have more 1 "identifier" (for example 1 , 14 both give ace
- should add 2 keys dictionary?).
what's best practice in scenario?
instead of storing type in dictionary, store func<card>
:
private dictionary<int, func<card>> cardfactories = { { 13, () => new king() }, // etc } public card getcard(int cardnumber) { var factory = cardfactories[cardnumber]; return factory(); }
in case of cards, i'd make them immutable start , populate dictionary cards themselves, that's different matter :)
Comments
Post a Comment