我需要一个模式:
我正在使用C#。
说有三个演员;吉姆,帕特和莎莉。 Pat的工作是创建一个接口作为Jim和Sally之间的合同。 Sally的工作是创建一个实现接口的类,Jim的工作是编写一个消耗Sally对象的类。
Jim不应该知道Sally的具体对象,只是它实现了公共接口。
Pat需要在合同中包含一种方式,让Jim创建一个Sally具体对象的实例,但作为接口引用。无法在接口或抽象类中包含静态方法定义,因此您无法执行以下操作:
public interface IFoo
{
public static IFoo CreateIFoo();
}
Pat如何编写合同以保证Sally将为Jim创建一个方法来创建她作为界面引用的具体对象?
答案 0 :(得分:1)
如果可能,请索取Sally的实例:
class Jim
{
public Jim(Sally sally){ /* ... */ }
}
但是,如果Jim需要知道什么时候构建Sally,你可以传递一个代表:
class Jim
{
private Func<Sally> _createSally.
public Jim(Func<Sally> createSally)
{
_createSally = createSally;
}
public void ConsumeSally()
{
Sally sally = _createSally();
/* ... */
}
}
最简单的用法:
var jim = new Jim( () => new Sally() );
您不需要类(Pat)知道如何实例化,除非它确实为您的代码增加了价值。无论哪种方式,你可能不希望吉姆知道帕特,所以如果需要帕特这就是你想要的:
var jim = new Jim( () => Pat.GetSally() );
答案 1 :(得分:0)
听起来你需要一个抽象的工厂。除IFoo
之外,使用IFooFactory
方法创建接口CreateFoo
。给Jim一个实现IFooFactory
的对象的实例,Jim会调用CreateFoo
方法。创建实现IFooFactory
的对象的实例可能是Sally或Pat的工作。