德米特对工厂模式和依赖注入的规律

Tit*_*ore 1 dependency-injection law-of-demeter

我有一个关于依赖注入的问题.

说我想创建一个类调用它,WebGetTask

WebGetTask需要依赖HttpService

坏代码1代码:

private HttpService  httpService;
...   
List<WebGetTask> list = new ArrayList<WebGetTask>();   
for(...)   
{   
   list.add(new WebGetTask(httpService)); 
}
...
Run Code Online (Sandbox Code Playgroud)

好.我知道这很糟糕,因为注入了httpService,但它从未使用过,除了在新的WebGetTask上创建

好坏代码2代码:

private WebGetTaskFactory webGetTaskFactory;
...  
List<WebGetTask> list = new ArrayList<WebGetTask>();  
for(...)  
{   
    list.add(webGetTaskFactory.newTask());  
}  
...
Run Code Online (Sandbox Code Playgroud)

我认为这更好,因为我们使用工厂但......

从我所在的位置,我可以看到在WebGetTaskFactory中我们仍然注入一个HttpService并且没有对它做任何事情,除了创建一个新的WebGetTask的唯一目的

所以回顾一下我的问题是如何设计一个工厂类(WebGetTaskFactory),当新对象在其构造函数上需要依赖项(HttpService)而不是简单地注入和传递依赖项(HttpService)时,它会创建新对象(WebGetTask)?或者更确切地说,这是这样做的方式吗?如果是这样,那么一切都很好,如果不是,那么请指导我如何正确使用DI和工厂模式.谢谢.

Wim*_*nen 8

我将假设您显示的代码是DownloadManager类的一部分,并且您通过构造函数注入依赖项.在这种情况下,我希望将所有内容粘合在一起的启动代码如下所示:

IHttpService httpService = new HttpService();
IWebGetTaskFactory webGetTaskFactory = new WebGetTaskFactory(httpService);
IDownloadManager downloadManager = new DownloadManager(webGetTaskFactory);
Run Code Online (Sandbox Code Playgroud)

DownloadManager类只知道IWebGetTaskFactory接口.它不了解IHttpService,因此满足了Demeter的规律.

编辑:在重新阅读您的问题之后,您似乎担心您没有在工厂中"使用"HttpService,除非将其传递给新的WebGetTask.还行吧.WebGetTaskFactory和WebGetTask都需要一个HttpService实例来完成它们的工作.这不违反得墨忒耳的法律.