2015-10-06 107 views
1

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

我已经阅读了许多有关它在stackoverflow(和其他地方)的主题,特别是马克·塞曼的,但不能作出任何决定,所以需要你的意见。

例如:

<?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. 我在互联网上发现的第三种解决方案是创建一种建造者而不是事件。工厂有责任知道要创建哪种对象,并且建造者将知道如何创建它们。

    问题:构建器DP的角色是否处理依赖关系?我害怕得到与解决方案#1相同的问题。

    我们该怎么办?

    +0

    很多很好的问题产生一定程度的基于专家经验的意见,但这个问题的答案将趋于几乎完全基于意见,而不是事实,引用或专门知识。 – Epodax

    +0

    @Epodax:你自己的意见是什么? –

    +2

    你的问题是离题。 – Epodax

    回答

    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); 
           } 
         } 
        } 
    } 
    
    +0

    不了解“责任链”部分。你能给我一个概念证明或伪代码来说明吗? –

    +0

    添加了更简单选项的图示。所有你需要做的是将所有已知的'ISingleTypeEventFactory'实现注入到这个类 –

    +0

    ps中,对于混合伪代码抱歉。开始写在C#语法然后意识到这是一个PHP问题,所以试图在中间和结束更多的PHP-Y :) –