C#工厂模式新手

时间:2015-03-31 12:57:25

标签: c# factory-pattern

我一直在阅读有关工厂/抽象工厂/简易工厂等的所有信息。我一直无法找到这个问题的答案。我理解工厂创建的类必须实现相同的接口,或者从相同的基类派生。但是如果不同的类不会以相同的公共接口结束会发生什么呢? I.E. SubClass1和SubClass2都派生自BaseClass。现在SubClass1 添加 PropertyA,SubClass2添加PropertyB。我是否正确认为这些课程不能由工厂创建,因为他们不会拥有相同的界面?或者,如果它们是作为BaseClass创建的,则它们不会公开它们的新属性。通用接口存在同样的问题。如果有人知道一个解决这个问题的作者,我会很感激参考。

非常感谢!

1 个答案:

答案 0 :(得分:2)

我认为你已经错过了界面的目的。如果您正在使用接口,那么创建具有不属于接口的公共方法的类可能不是最佳做法。

因此,如果您的工厂生产IAnimal。您不应该假设您正在获得实现WagTail方法的Dog类或LandsOnFeet的Cat类。您需要定义IDog和ICat。 (可能继承自IAnimal)。

然后,您可以考虑工厂的行为方式。你有几个选择。

一个。泛型

然后,您可以创建一个Generic Factory接口IAnimalFactory,该接口在实现时返回IAnimal或特定类型。

public interface IAnimal
    {
        int Legs();
    }

public interface IAnimalFactory<T> where T: IAnimal 
{
    IAnimal CreateAnimal();
    T CreateSpecificAnimal();
}

public interface IDog:IAnimal 
{
    void WagTail();
}

public interface ICat : IAnimal
{
    void LandOnFeet();
}

public class Dog:IDog
{
//Implementation Excluded
}

public class Cat : ICat
{
 //Implementation Excluded
}

public class DogFactory:IAnimalFactory<IDog>
{
    public IAnimal CreateAnimal()
    {
        return (IAnimal)CreateSpecificAnimal();
    }

    public IDog CreateSpecificAnimal()
    {
        return new Dog();
    }

}

public class CatFactory : IAnimalFactory<ICat>
{
    public IAnimal CreateAnimal()
    {
        return (IAnimal)CreateSpecificAnimal();
    }

    public ICat CreateSpecificAnimal()
    {
        return new Cat();
    }

}

如果您决定实施IDomesticDog或IWildDog,Generic方法会为您提供一些未来的证明,这是我的偏好,但根据您的需要可能会更复杂。

B中。每个子类的具体方法

您还可以创建一个具有创建IAnimal类型的狗或猫的函数的工厂。

public class AnimalFactory
    {
        public IAnimal GetDog()
        {
            return (IAnimal) new Dog();
        }

        public IAnimal GetCat()
        {
            return (IAnimal) new Cat();
        }

    }

现在如上所述,您可以安全地投射到IDog或ICat。

我认为没有一位作者专门回答你的问题。但是,阅读控制和依赖注入反转可能会为您提供所需的正确信息。