接口,该接口包含创建实例的方法
本文关键字:接口 方法 实例 包含 创建 | 更新日期: 2023-09-27 18:18:57
我需要一个图案:
我正在使用c#。
假设有三个演员;吉姆,帕特和莎莉。Pat的工作是创建一个接口,作为Jim和Sally之间的契约。Sally的工作是创建一个实现接口的类,而Jim的工作是编写一个使用Sally对象的类。
Jim不应该知道Sally的具体对象,只应该知道它实现了公共接口。
Pat需要在契约中包含一种方法,使Jim可以创建Sally的具体对象的实例,但作为接口引用。
没有办法在接口或抽象类中包含静态方法定义,所以你不能这样做:
public interface IFoo
{
public static IFoo CreateIFoo();
}
Pat如何编写契约来保证Sally将为Jim创建一个方法来创建她作为接口引用的具体对象?
如果可能的话,请求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)来知道如何实例化sally,除非它确实为你的代码增加了价值。不管怎样,你可能都不想让Jim知道Pat,所以如果需要Pat,你会这样做:
var jim = new Jim( () => Pat.GetSally() );
听起来您需要一个抽象工厂。在IFoo
的基础上,使用CreateFoo
方法创建接口IFooFactory
。给Jim一个实现IFooFactory
的对象实例,Jim将调用CreateFoo
方法。创建实现IFooFactory
的对象实例可能是Sally或Pat的工作。