接口,该接口包含创建实例的方法

本文关键字:接口 方法 实例 包含 创建 | 更新日期: 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的工作。

相关文章: