Паттерн фабрики, который будет удовлетворять принципу "открыто/закрыто"?

У меня есть следующие конкретные Животные продукты: 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, чтобы отразить новое отображение.

Есть ли способ сделать создание более "динамичным" с помощью отражения? Что еще более важно, есть ли в моем проекте какой-нибудь антипаттерн?

12
задан Ian 24 October 2011 в 13:36
поделиться