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

时间:2013-06-17 18:34:57

标签: c# interface design-patterns contract

我需要一个模式:

我正在使用C#。

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

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

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

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

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

Pat如何编写合同以保证Sally将为Jim创建一个方法来创建她作为界面引用的具体对象?

2 个答案:

答案 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的工作。