Хорошие люди от stackoverflow,
Как всегда, я пишу фабрику для динамического создания объектов.
Для схематизации у меня есть четыре типа:
class CatDescriptor : PetDescriptor
class DogDescriptor : PetDescriptor
class Cat : Pet
class Dog : Pet
Я привожу два последних типа с завода. И тут возникает дилемма:
Должен ли я просто протестировать типы дескрипторов с помощью оператора «is», который скрывает отражение, а затем что-то стоит.
static Pet.Factory(PetDescriptor descriptor)
{
if (descriptor is CatDescriptor)
{
return new Cat();
}
else if (...)
{
...
}
}
Должен ли я использовать Enum "Type" в качестве атрибута, встроенного в PetDescriptor.
class PetDescriptor
{
public Type PetType;
public enum Type
{
Cat,
Dog
}
}
static Pet.Factory(PetDescriptor descriptor)
{
switch (descriptor.PetType)
{
case PetDescriptor.Type.Cat:
return new Cat();
....
}
}
Или используйте виртуальные методы:
class PetDescriptor
{
public virtual bool IsCat()
{
return false;
}
...
}
class CatDescriptor : PetDescriptor
{
public override bool IsCat()
{
return true;
}
}
static Pet.Factory(PetDescriptor descriptor)
{
if (descriptor.IsCat())
{
return new Cat();
}
else if (...)
{
...
}
}
Голоса открыты!
edit: вопрос касается производительности отражения, а не фабричного дизайна.