首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >除了子类之外,工厂方法模式还有什么好处?

除了子类之外,工厂方法模式还有什么好处?
EN

Stack Overflow用户
提问于 2012-02-07 02:50:42
回答 4查看 713关注 0票数 2

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

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

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

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-02-07 14:46:41

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-02-07 02:59:49

你能解释更多吗?实现颜色结构的哪个部分是工厂?

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

参考

代码语言:javascript
复制
http://en.wikipedia.org/wiki/Software_design_pattern
票数 0
EN

Stack Overflow用户

发布于 2012-02-07 05:01:17

对于一般的软件,工厂通常被用来减少依赖。只有工厂需要知道它可以创建的所有类型,它必须应用的转换,并且许多依赖项可以从客户机中抽象出来--处理工厂的客户端不需要查看工厂可能创建的每个类型的接口。

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

因此,CodeInChaos指出,在这种情况下,它确实是一个命名的构造函数--但是,在这个场景中,是否仍然存在可以抽象的物理依赖呢?,是的,。让我们使用颜色创建一个示例场景。

假设有一个定义颜色的类。这个类有多个专门化和不同的成员,以便准确地表示每个可用颜色的专门化--比如Grayscale、RGB和CMYK。一种天真的转换方法已经能够产生非法的颜色。使用工厂方法,您可以通过请求任意颜色的类型来转换其颜色模型,从而使用类型来抽象这种复杂性。也就是说,将RGBA转换为Grayscale是一个函数,CMYK到RGBA的转换是另一个函数。抽象颜色表示可能有一个名为asRGBA()的方法来处理此转换,其中每个专门化或子类型可能提供非常不同的转换实现。

好吧,这抽象了一些复杂性,并使我们所有的颜色都是合法的(RGB不能表示所有的CMYK值)。看起来太复杂了?No。在现实中,有更多的颜色表示。此外,还有一些颜色配置文件可以是特定于设备(例如监视器),也可以是特定于其他目标(例如,连接的打印机)。这些概要文件的转换函数要复杂得多。

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

这是一个人为的例子(我不是C#开发人员),但它确实说明了如何使用工厂方法来降低复杂性和最小化依赖关系。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9170368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档