У меня есть следующие конкретные Животные
продукты: Dog
и Cat
.
Я использую параметризованный метод Factory для создания указанных продуктов. В зависимости от параметра AnimalInfo
, который передается в метод Factory, будет создан конкретный продукт. Логика отображения размещена в методе Factory.
Вот мой код:
public abstract class AnimalInfo
{
public abstract String Sound { get; }
}
public class DogInfo : AnimalInfo
{
public override string Sound
{
get { return "Bark"; }
}
}
public class CatInfo : AnimalInfo
{
public override string Sound
{
get { return "Meow"; }
}
}
public abstract class Animal
{
public abstract void Talk();
}
public class Dog : Animal
{
private readonly DogInfo _info;
public Dog(DogInfo aInfo)
{
_info = aInfo;
}
public override void Talk()
{
Console.WriteLine(_info.Sound);
}
}
public class Cat : Animal
{
private readonly CatInfo _info;
public Cat(CatInfo aInfo)
{
_info = aInfo;
}
public override void Talk()
{
Console.WriteLine(_info.Sound);
}
}
Вот мой метод Factory с его логикой:
public static class AnimalFactory
{
public static Animal CreateAnimal(AnimalInfo aInfo)
{
if (aInfo is DogInfo)
return new Dog(aInfo as DogInfo);
if (aInfo is CatInfo)
return new Cat(aInfo as CatInfo);
return null;
}
}
Проблема, которую я вижу здесь, заключается в том, что сам метод Factory нарушает принцип Open/Closed таким образом, что если я добавлю новое животное, мне нужно будет изменить метод Factory, чтобы отразить новое отображение.
Есть ли способ сделать создание более "динамичным" с помощью отражения? Что еще более важно, есть ли в моем проекте какой-нибудь антипаттерн?