I want to return an Interface and inside a switch statement I would like to set it. Is this a bad design?
private IResultEntity GetEntity(char? someType)
{
IResultEntity entity = null;
switch (someType)
{
case 'L': //life
entity = new LifeEntity();
break;
case 'P': //property
entity = new PropertyEntity();
break;
case 'D': //disability
entity = new DisabilityEntity();
break;
case 'C': //credit card
entity = new CreditCardEntity();
break;
}
return entity;
}
I don't usually mind switch statements in a factory, provided I can group and control all of the derived classes that I want my factory to create in advance.
Sometimes,maybe a user-created plugin might want to add it's own classes to that switch list, and then a swich statement is not enough.
I found this good source for some more info on creating some more powerfull/versatile factory classes
A good middle-ground approach I usually take is to keep a static Dictionary< string,Type > for each factory class.
People can just "register" their own implementations using some sort of
Factories.TypeRegistration.StaticDictionary.Add("somekey",typeof(MyDerivedClass))
(or better yet, use a Registration method and hide the StaticDictionary)
then the Factory has an easy task of creating an instance by performing a lookup in the table:
Activator.CreateInstance(Factories.TypeRegistration.StaticDictionary["somekey"]);