抽象工厂 - 如何从客户端删除混凝土工厂的依赖关系

时间:2015-07-06 14:59:52

标签: design-patterns solid-principles ooad

在所有抽象工厂实现中,调用代码(客户端)必须知道具体工厂。这只是消除对产品的依赖,并依赖于具体工厂来替换该依赖。几乎所有的例子都这样做。有没有办法从客户端删除此依赖项?

3 个答案:

答案 0 :(得分:1)

我认为这里不依赖于混凝土工厂:

partial class FactoryClient
{
    private readonly IThingFactory _thingFactory;
    public FactoryClient(IThingFactory thingFactory)
    {
        _thingFactory = thingFactory;
    }
    public void Work()
    {
        // ...
        var thing = _thingFactory.Create(1, 2, 3);
        // ...
    }
}

您可以将IThingFactory的任何自定义实施注入FactoryClientFactoryClient仅取决于IThingFactory界面。

如果您确实想要创建对象,则无法避免依赖于创建对象(参数和其他详细信息)的方式。您可以做的最好 - 在接口中指定此依赖项并在更高级别上找到正确的实现。

答案 1 :(得分:1)

您可以通过将工厂注入lambda来删除任何硬依赖:

static void Main(string[] args)
{
    var client = new Client(name => new Service(name));
}

public sealed class Client 
{
    private readonly IService service;

    public Client(Func<string, IService> serviceFactory) 
    {
        this.service = serviceFactory("Client");
    }
}

public sealed class Service : IService
{
    public Service(string name) 
    {
        //... 
    }
}

答案 2 :(得分:-1)

显然,通过创建一个返回工厂的类,也就是工厂工厂。但这只是依赖于工厂工厂来取代对工厂的依赖。但是通过建立一个创建工厂工厂的工厂可以轻松解决这个问题。等等。

现在想想你通过这样做获得了什么。