C#工厂 – 一定要上播吗?

C#工厂模式是否需要upcast?

我希望上帝在课堂图书馆G中在课堂图书馆A中创建一个亚当,而不会使G依赖于A.上帝产生亚当斯,在E类在图书馆E中消费,夏娃知道并依赖于亚当。
(编辑 – 这个样本越来越好:)

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

现在,因为上帝不允许认识亚当,AdamFacotry的CreateAdam必须返回一个对象,这就要求Eve将AdamFactory返回的对象重写一个Adam。

这样会有效,我想。然而,我对于投机感到不安,因为它是一个不要的。这真的是必须的吗?

附: – 没有亵渎的意图,如果有人感到受伤,我很抱歉。使用神和亚当而不是创造者和创造似乎更好,因为后两个词彼此太相似。

编辑:接口建议。我们假设Adam有两种方法:ProvideLove,ProvideFood和ProvideProtection(我们保持这个样例是安全的)。夏娃以这两个目的使用亚当,但当然神不会。那么为什么要向上帝提供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
我不知道我完全明白要求,但这里是一个建议:


//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();
    }
}

和用法:


//Somewhere in assembly E
Adam adam = new God().Create(new AdamFactory());
翻译自:https://stackoverflow.com/questions/4872304/c-sharp-factory-is-upcast-a-must

转载注明原文:C#工厂 – 一定要上播吗?