3

我需要一个模式:

我正在使用 C#。

假设有三个演员;吉姆、帕特和莎莉。Pat 的工作是创建一个接口作为 Jim 和 Sally 之间的合同。Sally 的工作是创建一个实现接口的类,Jim 的工作是编写一个使用 Sally 对象的类。

Jim 不应该知道 Sally 的具体对象,只知道它实现了公共接口。

Pat 需要在合同中包含一种方法,让 Jim 创建 Sally 的具体对象的实例,但作为接口引用。

无法在接口或抽象类中包含静态方法定义,因此您不能执行以下操作:

public interface IFoo
{
    public static IFoo CreateIFoo();
}

Pat 如何编写合同以保证 Sally 将为 Jim 创建一个方法来创建她的具体对象,该具体对象被引用为接口?

4

2 回答 2

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)来知道如何实例化 sally,除非它真的为你的代码增加了价值。无论哪种方式,您可能都不希望 Jim 了解 Pat,所以如果需要 Pat,这就是您想要的:

var jim = new Jim( () => Pat.GetSally() );
于 2013-06-17T18:53:12.180 回答
0

听起来你需要一个抽象工厂。此外,使用该方法IFoo创建一个接口。给 Jim 一个实现 的对象的实例,Jim 会调用该方法。创建实现的对象实例可能是 Sally 或 Pat 的工作。IFooFactoryCreateFooIFooFactoryCreateFooIFooFactory

于 2013-06-17T18:39:16.410 回答