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());
相关文章
转载注明原文:C#工厂 – 一定要上播吗? - 代码日志