C#工厂 - 是必须的?

Avi*_*Avi 18 c# factory casting factory-pattern

C#工厂模式是否需要向上转换?

我希望上课在图书馆G中在班级图书馆A中创造一个亚当,而不使G依赖于A.上帝在班级图书馆E中为夏娃制作亚当斯,夏娃可以知道并依赖亚当.(编辑 - 这个样本越来越好:)

我能想到的解决方案是在A中有一个AdamFactory.这样AdamFactory知道Adam并且可以很容易地创建它(可能只是调用Adam的构造函数).上帝收到一个AdamFactory,可以命令CreateAdam.

现在,因为上帝不被允许认识亚当,AdamFacotry的CreateAdam必须返回一个物体,这需要Eve将AdamFactory返回的物体向上投射到亚当身上.

我认为这会奏效.然而,我对上传感到不安,因为这是禁忌.这真的是必须的吗?

PS - 没有Blasphemy的意图,如果某人的感受受到伤害我会道歉.使用上帝和亚当而不是创造者和创造似乎更好,因为后两个词彼此太相似了.

编辑:重新接口建议.让我们假设Adam有两种方法:ProvideLove,ProvideFood和ProvideProtection(我们保持这个样本是kis-safe :).夏娃将亚当用于这两个目的,但当然上帝没有.那么为什么要向上帝提供AdamFactor返回实现IAdam而不仅仅是对象的东西的知识呢?我不明白!

编辑:工作代码(同一个库中的每个人,我的目标是分离到不同的库)看起来像这样:

Adam God.LoadAdam(AdamID theAdamID)
       var adam = new Adam(theAdamId, this)

Adam.Adam(AdamID theAdamID, God theGod)
      _god = theGod
      _mind  = theGod.LoadMind(theAdamId, this)

Mind God.LoadMind (AdamID theAdamID, Adam theAdam)
      var mind  = new Mind (theAdam)
      var mindId = new minId(theAdamId)
      mind.DeserializeFromFile(minId)

Mind.Mind (Adam theAdam)
      _adam = theAdam
Run Code Online (Sandbox Code Playgroud)

Sti*_*gar 9

我不确定我是否完全理解这些要求,但这里有一个建议:


//in assembly G
public abstract class HumanFactory<T>
{
    public abstract T CreateHuman();
}

//in assembly A
public class Adam { }
//in assembly A
public class AdamFactory : HumanFactory<Adam>
{
    public override Adam CreateHuman()
    {
        return new Adam();
    }
}

//in assembly G
public class God
{
    public T Create<T>(HumanFactory<T> factory)
    {
        return factory.CreateHuman();
    }
}

Run Code Online (Sandbox Code Playgroud)

和用法:


//Somewhere in assembly E
Adam adam = new God().Create(new AdamFactory());
Run Code Online (Sandbox Code Playgroud)