抽象工厂是否可以负责创建或找到现有的"项目?

时间:2016-05-31 08:42:57

标签: ruby design-patterns abstract-factory

我的Ruby代码有一个 Concrete Factory ,它构建了一些复杂的对象:

author = Author::Factory.build(email: "john@example.com")

class Author
  class Factory < BaseFactory
    def self.build(email: nil)
      # ... Some data preparation and defaults
      Author.new(
        email: email
        # Map and assign more attributes
      )
    end
  end
end

现在,我遇到了需要建立一个新的情况, 或从现有集合中分配一个。在 数据库术语:UPSERT或ActiveRecord:find_or_create_by

我不确定是否:

  1. 是抽象工厂的正确任务和
  2. 如果实现这个的正确方法是通过传递集合,或 使工厂本身负责取出它。
  3. 传递进来:

    author = Author::Factory.build(email: "john@example.com", existing: authors)
    
    class Author
      class Factory < BaseFactory
        def self.build(email: nil)
          author = existing.find {|author| author.email == email }
          # If not found, prepare and build a new one, like above.
        end
      end
    end
    

    让工厂找到它:

    author = Author::Factory.build(email: "john@example.com")
    
    class Author
      class Factory < BaseFactory
        def self.build(email: nil)
          author = Author.find_in_existing_with(email: email)
          # If not found, prepare and build a new one, like above.
        end
      end
    end
    

    那么:工厂是否应该负责发现或建造?

    如果是这样,工厂必须负责取出那些物品 它必须匹配,或者呼叫者是否应该通过它们?

1 个答案:

答案 0 :(得分:0)

工厂是一种创造性模式,因此客户可以期待新的实例。

当然,工厂内部的工作与使用代码无关。但是如果Author是一个域实体,我就无法看到消费者如何使用Author构建对象,而不是在系统中添加新作者的“真实世界”。 / p>

除非您希望在语义上不公平并通过重用现有作者而不是实例化新作者来欺骗调用者。但这看起来不像你通常会在制作中做的事情。