【问题标题】:What are the benefits of the factory method pattern aside from subclassing?除了子类化之外,工厂方法模式还有什么好处?
【发布时间】:2012-02-07 02:50:42
【问题描述】:

在使用 .NET Color 结构时,我发现自己想知道为什么微软选择为这个结构使用工厂方法模式(知道工厂方法模式主要用于子类化,而结构不能被子类化)。

我尝试了维基百科。它证实了我的想法,但实际上并没有给出答案:

虽然工厂方法模式背后的动机是允许 子类来选择创建哪种类型的对象,还有其他的 使用工厂方法的好处,其中许多不依赖于 子类化。因此,通常定义“工厂方法” 不是为了获得这些其他对象而创建对象的多态性 好处。此类方法通常是静态的。

那么,告诉我,工厂方法模式的这些其他好处是什么?

例如,我如何从调用Color myColor = Color.FromArgb(255,255,255) 而不是Color myColor = new Color(255,255,255) 中受益?

(请注意,第二种方法实际上是不可能的,因为 Point 结构没有参数化构造函数,因为它使用了工厂方法模式)

【问题讨论】:

    标签: .net design-patterns factory-pattern


    【解决方案1】:

    我使用这种方法的主要原因是因为它们实际上是命名构造函数。例如,对于Color,指定组件的顺序在没有名称的情况下并不明显。通常使用ARGB,但有时您也会看到BGRA,甚至是完全不同的颜色空间,例如HSV。将使用的颜色顺序放入方法名称中,使代码更具自我记录性。

    另一个优点是静态方法支持类型推断。例如使用Tuple<...>,您可以简单地使用Tuple.Create(1,5),而不是更冗长的new Tuple<int,int>(1,5)

    【讨论】:

      【解决方案2】:

      你能解释更多吗? Color 结构体实现的哪一部分是工厂?

      此外,您似乎不匹配“工厂”AKA(抽象工厂)和“工厂方法”模式。两者都是创造模式。但它们是不同的,用于不同的目的。

      参考

      http://en.wikipedia.org/wiki/Software_design_pattern
      

      【讨论】:

      • 我说的是工厂方法模式。我澄清了我的问题。
      【解决方案3】:

      我不认为术语“工厂方法”通常用于指代返回结构的方法,因为返回结构的 所有 方法返回一个以前不存在的实例(具有讽刺意味的是,从 vb.net 调用的结构构造函数除外)。

      【讨论】:

        【解决方案4】:

        msdn 的这句话暗示了一个目的:

        当您使用 new 运算符创建结构对象时,它会被创建并调用相应的构造函数。与类不同,结构可以在不使用 new 运算符的情况下进行实例化。如果不使用 new,则字段将保持未分配状态,并且在所有字段都初始化之前无法使用对象。

        工厂方法模式,在 .NET 结构的上下文中,防止未初始化的实例

        【讨论】:

          【解决方案5】:

          对于软件一般,工厂通常用于减少依赖关系。只有工厂需要知道它可以创建的所有类型、它必须应用的转换以及许多依赖关系可以从客户端抽象出来——处理工厂的客户端不需要查看工厂的每种类型的接口可以创建。

          由于语言的解释和编译方式非常不同,因此这对某些语言的影响要大于其他语言。因此,抽象工厂可以将整个库隐藏在其接口后面。

          所以 CodeInChaos 指出在这种情况下它实际上是一个命名构造函数——但是 可能 在这种情况下仍然可以抽象出物理依赖吗? 是的!。让我们使用颜色创建一个示例场景。

          假设有一个定义颜色的类。这个类有多个专业化和不同的成员,以便准确地表示每种可用的颜色专业化——比如说灰度、RGB 和 CMYK。一种简单的转换方法已经能够产生非法颜色。使用工厂方法,您可以使用类型来抽象复杂性,方法是请求任意颜色的类型由其颜色模型转换。即RGBA转换为灰度的转换是一个函数,CMYK转换为RGBA是另一个函数。抽象颜色表示可能有一个名为 asRGBA() 的方法来处理此转换,其中每个特化或子类型可能提供截然不同的转换实现。

          好吧,这抽象了一些复杂性并保持我们所有的颜色合法(RGB 不能代表所有 CMYK 值)。似乎过于复杂? 。实际上,有更多的颜色表示。此外,还有可能特定于设备(例如监视器)或特定于其他目标(例如连接的打印机)的颜色配置文件。这些配置文件的转换函数要复杂得多。

          对于基本的颜色表示,我们必须注入许多依赖项来处理所有这些设备和目标。精心设计的工厂方法可以抽象出所有这些,并为这些转换使用优化的实现,同时减少依赖关系。

          这是一个人为的示例(我不是 C# 开发人员),但它确实说明了如何使用工厂方法来降低复杂性并最大限度地减少依赖关系。

          【讨论】:

          • 你说的是子类化优势,这不是我的问题。
          • @asmo 在这种情况下的依赖减少当然不限于子类化。您的问题已修改 4 次 - 我已回答原问题。
          • @asmo 我已经根据您的问题更新了我的答案。
          猜你喜欢
          • 2012-02-26
          • 1970-01-01
          • 2021-05-28
          • 2014-01-31
          • 2015-01-14
          • 1970-01-01
          • 2016-12-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多