1

我们必须实现一个能够创建多个复杂对象的工厂。我们应该如何使用依赖注入来处理它?

我已经在 stackoverflow(和其他地方)中阅读了许多关于它的主题,尤其是 Mark Seemann 的主题,但无法做出任何决定,因此需要您的意见。

例如:

<?php
class EventFactory
{
    public function createEvent($type)
    {
        switch ($type) {
            case 'upload':
                return new UploadEvent(new FtpUploader(), new Mailer());
            case 'download':
                return new DownloadEvent(new FtpDownloader(), new Mailer());
            case 'save':
                return new SaveEvent(new EventDbModel());
            case 'load':
                return new LoadEvent(new EventDbModel());
            case 'notify':
                return new NotifyEvent(new HttpRequester());
        }
    }
}

我找到了一些解决方案,但不知道该选择哪一个。

  1. 一个解决方案是,就像在示例中一样,让工厂负责实例化依赖项。

问题:与不使用依赖注入相同。

  1. 另一种是给工厂构造函数提供依赖

问题:构造函数中的参数会很多而且列表会变大

  1. 我也在互联网上找到的第三种解决方案是创建一种构建器而不是事件。工厂负责知道要创建哪种对象,而构建者将知道如何创建它们。

问题:builder DP的角色是处理依赖关系吗?我害怕遇到与解决方案 #1 相同的问题。

我们应该做什么 ?

4

1 回答 1

3

就我个人而言,我会选择选项 2。当您想要配置建筑物但对客户端隐藏实现时,通常会使用构建器。当您只需要传递参数时,工厂通常会更好。

如果您担心参数的数量,那么您可以将参数对象传递给工厂,或者生成单一责任工厂,每个工厂都知道他们创建的事物的类型以及如何创建它,然后将它们组装成责任链,询问每个人是否可以创建请求的类型,如果不能,则将其传递,或者甚至只是“单一类型工厂”实例的简单列表。

这样,每个“工厂”只有它需要的依赖项,而链只是编排可用的工厂,因此只需要对它们的依赖项,对它们有什么依赖项一无所知。

不使用责任链更简单。像这样的一些解决方案:

public class EventFactory
{
    IEnumerable<ISingleTypeEventFactory> factories

    public EventFactory(IEnumerable<ISingleTypeEventFactory> factories)
    {
         this.factories = factories;
    }


    public Event CreateEvent($type)
    {
         foreach(factory in factories)
         {
              if (factory.CanHandleType($type))
              {
                   return factory.CreateEvent($type);
              }
         }
    }
}
于 2015-10-06T13:55:01.990 回答