我的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
。
我不确定是否:
传递进来:
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
那么:工厂是否应该负责发现或建造?
如果是这样,工厂必须负责取出那些物品 它必须匹配,或者呼叫者是否应该通过它们?
答案 0 :(得分:0)
工厂是一种创造性模式,因此客户可以期待新的实例。
当然,工厂内部的工作与使用代码无关。但是如果Author
是一个域实体,我就无法看到消费者如何使用Author
构建对象,而不是在系统中添加新作者的“真实世界”。 / p>
除非您希望在语义上不公平并通过重用现有作者而不是实例化新作者来欺骗调用者。但这看起来不像你通常会在制作中做的事情。