我一直在阅读关于Factory / Abstract Factory / Simple Factory / etc的所有资料。 我一直找不到这个问题的答案。 我了解工厂创建的类必须实现相同的接口,或从相同的基类派生。 但是,如果不同的类不以相同的公共接口结尾怎么办? IE SubClass1和SubClass2都派生自BaseClass。 现在,SubClass1 添加了 PropertyA,SubClass2添加了PropertyB。 我在假设这些类不能由工厂创建,因为它们不具有相同的接口是否正确? 或者,如果它们是作为BaseClass创建的,则它们不会公开其新属性。 通用接口也存在相同的问题。 如果有人认识到解决这个问题的作者,我将不胜感激。

非常感谢!

#1楼 票数:2

我认为您已经错过了界面的目的。 如果使用接口,则最好不要创建具有公共方法的类,这些类不是接口的一部分。

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

然后,您可以考虑工厂的行为方式。 您有两种选择。

A.泛型

然后,您可以创建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,则通用方法可为您提供一些将来的证明,这是我的偏爱,但根据您的需要,它可能比需要的更为复杂。

B.每个子类的特定方法

您也可以创建一个具有功能的工厂,该功能可以创建IAnimal类型的狗或猫。

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

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

    }

现在,按照上面的建议,您可以安全地投射到IDog或ICat。

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

  ask by TomC translate from so

未解决问题?本站智能推荐:

1回复

C#工厂模式

我正在构建一个索引几个不同数据源的搜索应用程序。 当针对搜索引擎索引执行查询时,每个搜索结果指定它来自哪个数据源。 我已经构建了一个工厂模式,我用它为每种类型的搜索结果显示不同的模板,但我意识到这种模式将变得更难以管理,因为越来越多的数据源被搜索引擎索引(即新的必须为每个新数据源创建代码模板
3回复

C#通用接口和工厂模式

我正在尝试创建一个Generic接口,其中一个方法的参数类型由泛型定义 编辑 我意识到我可能通过在Factory创建方法中指定一个类型参数来混淆问题后,我稍微改了一下这个问题。 我有两种类型的API调用,我需要对第三方API。 第一个使用ID作为int从API检索记录。 第二个也从
1回复

具有泛型的C#工厂模式

我想为myInterface做一个工厂类,但是我不能为具体的类调用构造函数,因为工厂类必须使用特定的参数T 有没有办法为通用接口创建工厂类? 简化示例
3回复

为什么在我的工厂模式实现c#中得到NullReferenceException?

主班: Cl_RepositoryFactory类: 枚举E_Repositories: I_Identifiable接口: I_Repository接口: Cl_UserRepository类: 和ClE_User类: 问题是,为什么使用vrcRepository会
1回复

C#中的依赖倒置原则与工厂模式[重复]

这个问题在这里已经有了答案: 依赖注入与工厂模式(29 个回答) 5年前关闭。 这两者有什么区别吗? 我正在尝试学习这些主题,并且两者看起来都是相同的概念
2回复

C#使用Activator.CreateInstance工厂模式如何

我有用户类说,用户 以及通过查看给定用户的Id来返回一组用户的界面 以下是IPeople的一些实现 现在在我的调用方法中 所以说,在我调用函数之前,我创建所有派生类的实例,然后检查我需要哪一个。 它的工作正常,但我觉得,从性能的角度来看,它不是一个非常好的解决方案,因为我通过反
4回复

C#-Ninject、IoC和工厂模式

我有一个控制台应用程序,我需要根据用户的输入执行某个功能。 如果用户输入“功能 1” -> 我执行功能 1,依此类推。 我正在尝试尽可能干净和通用地编写这个项目,并且我想使用IoC和SOLID概念,但我有点卡住了。 到目前为止我所拥有的: 和 我的第一个想法是在具体的 Factory 类上设置
2回复

工厂模式实施

我需要根据某个值创建许多不同的对象之一,并建议我研究一下Factory模式。 我不希望我的客户决定要创建哪个对象或要求使用硬编码的类名,因此在阅读后,我想到了以下(简化的)示例: 上面的方法有效,但是我对自己的实现是否正确感到有些困惑。 如果可以避免,我宁愿不要像Factory Met