如何命名工厂像方法?

我想大多数工厂像方法开始create 。 但为什么他们叫做“ 创造 ”? 为什么不“ 制造 ”,“ 生产 ”,“ build造 ”,“ 生成 ”或其他? 这只是一个品味问题吗? 一个约定? 还是在“创造”中有特殊意义?

 createURI(...) makeURI(...) produceURI(...) buildURI(...) generateURI(...) 

一般你会select哪一个,为什么?

一些随意的想法:

  • “创build”比大多数其他词更适合该function。 我能想到的另一个最好的词是'Construct'。 在过去,“Alloc”(分配)可能在相似的情况下被使用,反映出比C这样的语言中的对象更强调数据块。

  • “创造”是一个简短而简单的词,具有明确的直观意义。 在大多数情况下,人们可能只是把它当作第一个,当他们想创造一些东西时想到的最明显的词汇。 这是一个常见的命名约定,“对象创build”是描述创build对象过程的常用方法。

  • “构造”是相近的,但它通常用于描述创build对象(分配/新build,初始化…)过程中的特定阶段。

  • “构build”和“制造”是与编译代码有关的过程的常用术语,因此对程序员有不同的含义,这意味着一个包含许多步骤和可能大量磁盘活动的过程。 然而,工厂“构build”某种东西的想法是一个明智的想法 – 特别是在build立复杂数据结构的情况下,或者以某种方式组合许多单独的信息。

  • “生成”给我意味着一个计算,用来从input产生一个值,比如产生一个哈希码或一个随机数。

  • “生成”,“生成”,“构造”比“创build”更长。 从历史上看,程序员喜欢使用短名称来减less打字/阅读。

Joshua Bloch在“Effective Java”中提出了以下命名约定

valueOf – 返回一个实例,松散地说,它的参数值相同。 这样的静态工厂是有效的types转换方法。

– 一个简洁的替代valueOf,由EnumSet推广(Item 32)。

getInstance – 返回由参数描述的实例,但不能说具有相同的值。 在单例情况下,getInstance不接受参数并返回唯一的实例。

newInstance – 像getInstance一样,除了newInstance保证每个返回的实例都不同于其他实例。

getType – 像getInstance一样,但在工厂方法处于不同的类时使用。 Type表示工厂方法返回的对象的types。

newType – 和newInstance一样,但当工厂方法在不同的类中时使用。 Type表示工厂方法返回的对象的types。

想补充一点,我没有看到其他答案。

  1. 虽然传统上“工厂”是指“创造物体”,但我更喜欢从广义上把它看作是“回报我的行为像我期望的那样的物体”。 我不应该永远都不知道这是否是一个全新的对象 ,实际上我可能不在乎。 因此,在适当的情况下,您可能会避免使用“创build…”这个名称,即使这是您现在正在实施的方式。

  2. 番石榴是工厂命名想法的好储藏库。 这是一个很好的DSL风格的推广。 例子:

     Lists.newArrayListWithCapacity(100); ImmutableList.of("Hello", "World"); 

“创造”和“制造”是短暂的,合理的唤起,而不是绑定到我能想到的其他命名模式。 我也经常见到他们,并怀疑他们可能是“事实上的标准”。 我会select一个,至less在一个项目中一致地使用它。 (看着我自己目前的项目,我似乎用“make”,希望我是一贯的……)

避免“构build”,因为它适合Builder模式,避免“产生”,因为它唤起了生产者/消费者。

要真正延续这个模式的“工厂”名称的隐喻,我会被“制造”所诱惑,但这个词太长了。

我认为这源于“ 创造一个对象”。 然而,用英语来说,“创造”这个词是与“产生的东西”这个概念联系在一起的,这个概念是独特的东西,不会自然地演化或者不是由普通的过程产生的东西“,”从自己的思想发展而来想象力,作为一件艺术品或一项发明。“因此,”创造“似乎不是恰当的用词。 另一方面,“制造”的意思是“通过塑造或改变材料,结合零件等来形成”。例如,你不创造一件衣服,你一件衣服(物品)。 所以,在我看来,“做”的意思是“产生; 使存在或发生; 带来“是一个更好的工厂方法的话。

部分约定,部分语义。

工厂方法(由传统的create信号)应该调用适当的构造函数。 如果我看到buildURI ,我会认为它涉及到一些计算,或者从部件组装(我不认为有工厂参与)。 当我看到generateURI时,我想到的第一件事就是随机创build一个新的个性化下载链接。 它们并不完全相同,不同的词语唤起不同的意义; 但其中大部分都没有传统化。

我叫它UriFactory.Create()

哪里,

UriFactory是提供创buildUri实例的方法的类types的名称。

Create()方法的重载与你在规范中的变体一样多。

 public static class UriFactory { //Default Creator public static UriType Create() { } //An overload for Create() public static UriType Create(someArgs) { } } 

我会指出,我已经看到了所有的动词,但在某些图书馆或其他地方使用,所以我不会将创作称为通用约定。

现在,创作对我来说听起来更好,唤起了动作的确切含义。

所以是的,这是(文学)味道的问题。

我个人喜欢instantiateinstantiateWith ,但这只是因为我的Unity和Objective C的经验。 Unity引擎中的命名约定似乎围绕instantiate的单词来通过工厂方法创build实例,而Objective C似乎喜欢用来指示参数是什么。 如果方法在要实例化的类中(而且在允许构造函数重载的语言中,这并不是什么“事情”),那么这只能真正起作用。

只是普通的Objective C的initWith也是一个好的!

工厂方法不指定方法名称。 您可以在工厂中拥有多种方法,只要所有方法都返回同一家族中的对象。

欲了解更多详情,请访问urlhttp://xeon2k.wordpress.com