|
|
1
11
实际上,我认为他们提供的例子不一定是很好的例子。 构造类时,工厂模式在.NET中变得更有用。例如,看看 WebRequest class . 此类通常通过调用以下命令来实例化:
这个
WebRequest.Create
方法使用工厂模式。根据URL的类型,它将创建WebRequest的不同类型(子类)。如果你通过了它
通过在这里使用工厂模式,以后可以添加更多的URL类型,而不需要更改客户端上的任何代码——您只需传入不同的URL(作为字符串),并获得一个新的对象。 |
|
|
2
2
整个工厂的想法似乎不一样。这不仅是为了隐藏实现的复杂性,也是为了控制反转(IOC)。
在这个例子中
顺便说一下,最初工厂主要用于对象创建:想象C++库(DLL),它必须允许将一组自己的类型创建到Meave.exe。在不同的模块之间传递实例几乎是不可能的,因为它们的结构依赖于特定的编译器。但是可以通过接口。所以这样的DLL应该:
但正如您所知,.NET具有统一的程序集格式,可以在不同模块之间传递对象。此外,反射允许创建一个根本不知道的类型。所以.NET中的工厂很少使用。 |
|
|
3
1
工厂模式是我在程序中使用最多的模式。在某些情况下,它可能非常有用,但是使用它时一定要小心。 如果您的工厂看起来像一个构造函数重载,那么它可能是一个构造函数重载。 msdn文章中给出的例子并不好。事实上,在相当长的一段时间内,我一直相信in t、string等对象不会考虑彼此的重载,因为它们是 结构体 通常,结构构造函数不应该抛出异常(例如,如果可以将“hello world”馈送给int,则会发生这种情况),而不是类和。但我是这么想的。 当然,网络周围有很多地方,在那里你可以找到更好的解释何时使用工厂模式及其好处。Reed给出的例子是最好的例子之一,并且遵循我使用工厂的规则:当我有一个类层次结构或一些实现某个接口的类时,我使用工厂,并且我想要构建这些对象中的一个,但是收到一个超类/接口的对象,而不是对象本身。这样,调用工厂的对象 不必担心实现细节 . 它知道它期望某个类的对象,这就是它得到的,即使它是一个强制转换。 在我正在构建的当前应用程序(程序生成器)中,我需要解析数据表SQL定义。我使用一个家庭BREW解析器来实现这一点。每当解析器遇到一个变量(“标识符变量类型”)时,我调用一个工厂并将字符串传递给它。然后工厂检查变量类型substring并返回给我 SQL变量 ,实际上可能是 整数sqlvariable 或A charsqlvariable(字符变量) . 主解析器对象不知道它得到了什么变量。它将sqlvariable推送到一个列表并读取下一行。当然,我可以有一个类来处理所有变量类型;我个人选择不这样做。 |
|
|
4
0
是的,您可以使用构造函数重载来更改构造函数,而不必更改源代码中的每个区域,但是如果您不小心的话,这将很快导致大量的构造函数。 我认为本文的一般思想是隐藏实现,而不是为了解释构造函数的更改而必须防止大量的构造函数重载。作为对象的想法不应该知道如何构造它。 在给出的示例中,您不希望用如何从字符串或double中变成in t类来阻塞in t类,因此您创建的工厂的唯一职责是从y参数创建x对象。 我肯定会建议头一设计模式书作为学习设计模式的一个很好的入门。这些例子是基于Java的,但它们背后的逻辑,不管你使用什么语言。 |