在所有抽象工厂实现中,调用代码(客户端)必须知道具体工厂。这只是消除对产品的依赖,并依赖于具体工厂来替换该依赖。几乎所有的例子都这样做。有没有办法从客户端删除此依赖项?
答案 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
的任何自定义实施注入FactoryClient
。 FactoryClient
仅取决于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)
显然,通过创建一个返回工厂的类,也就是工厂工厂。但这只是依赖于工厂工厂来取代对工厂的依赖。但是通过建立一个创建工厂工厂的工厂可以轻松解决这个问题。等等。
现在想想你通过这样做获得了什么。