C#工厂模式是否需要上调?
我希望上帝在类(class)库G中创建类(class)库A中的一个亚当,而又不让G依赖A。上帝在类(class)库E中生产亚当斯供夏娃消费,让夏娃知道并依赖亚当是可以的。
(编辑-该示例越来越好:)
我能想到的解决方案是在A中创建一个AdamFactory。这样,AdamFactory就会知道Adam,并且可以轻松地创建它(可能只是通过调用Adam的构造函数)。上帝收到一个AdamFactory,可以命令它到CreateAdam。
现在,因为不允许上帝认识亚当,所以AdamFacotry的CreateAdam必须返回一个对象,这要求夏娃将AdamFactory返回的对象向上转换到Adam。
我认为这会起作用。但是,我对转播感到不安,因为这是禁忌。这真的是必须的吗?
附言-没有亵渎的意图,如果有人的感情受到伤害,我深表歉意。似乎最好用上帝和亚当代替造物主和被造物,因为后两个词太相似了。
编辑:重新接口(interface)建议。让我们假设亚当有两种方法: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());