|
|
1
49
注:您拥有的是 不 一个静态构造函数,它是一个创建实例而不是自己调用实例构造函数的静态函数。静态构造函数完全不同。 工厂模式是使用函数(静态或非静态)实例化类型的经典示例,而不是直接使用构造函数。请注意,实际的实例构造函数将被调用,不管是什么,但是静态函数提供了一个间接层,允许它返回任何类型的实例,这些实例要么是返回类型,要么是从返回类型继承的,而不仅仅是那些 是 返回类型。 例如:
这可以让你隐藏
|
|
|
2
19
我正在研究这一点,遇到了这个问题,但感觉没有得到充分的回答。不过,我确实找到了这篇方便的文章- Design Guidelines Update: Factories vs. Constructors -作者KrzysztofCwalina(一个.NET框架的主要架构师)。值得一读整篇文章,但这里简要总结了以下要点:
|
|
|
3
9
工厂方法有帮助的另一个常见情况(在C语言中#
which don't support type inference from constructor
)当必须最小化类型参数规范时。考虑以下常见情况:
或
|
|
|
4
7
静态
|
|
|
5
3
工厂方法通常用于隐藏正在创建的对象的确切类型。抽象类可以有一个静态工厂方法,然后根据某些条件选择要实例化的具体派生类。只有抽象基类是公开文档。这使得库供应商可以在不破坏现有代码的情况下自由地更改正在实例化的确切类型。
.NET框架中的一个示例是
|
|
|
6
1
有时,对创建的类的每个实例进行簿记和/或资源管理很重要。因此,重要的是要对每一个构建进行全局管理,而一个静态的构建方法将很好地做到这一点。 |
|
|
7
1
如您所见,myClass没有遵循“经典”工厂模式(在工厂外实例的类是未知的/公开的)。 然而,在这种情况下,.NET框架团队可能不会瞄准工厂模式,但我想他们不希望您通过构造函数直接用文件名来创建目标类。 如果只提供此类,工厂可能会被过度杀戮。 在clone()方法中有时会看到这种模式,对象可以返回一个与自身类似的实例。 另外,尽管该类是公共的,但他们可能希望对实例化、文件名等进行一些检查。如果他们实现了工厂,则仍然可以创建和调用目标类,而忽略这些检查。 |
|
|
8
1
为您构造的方法非常有用:
…因为“普通”构造函数不能这样做。 |
|
|
9
1
不泄漏对引用程序集的程序集的依赖性是另一个原因。
似乎如果在另一个程序集中为某个类调用构造函数,您的程序集将需要引用定义任何重载所使用的任何类型的所有程序集。您可以通过使用不同名称的工厂方法来解决这种强制依赖。
assembly1.dll(要求对barassembly.dll的引用不太明显)
assembly2.dll(此处不需要引用barassembly.dll,因为createfoo和createfoowithbar不是重载)
fooassembly.dll(需要对barassembly.dll的明显引用)
数据库汇编语言
注:根据.NET Framework 4.5在VS2013建筑物上观察 |
|
10
0
你可以用咖喱工厂的方法。尝试使用构造函数会给您一个工厂方法。 我在列举Windows设备管理器树的一些代码中使用了这个。其中一个类列出了串行端口,每个串行端口都有一个连接工厂属性,该属性返回一个以内部状态存储的端口地址(非常难看的PNP设备字符串)为基础的工厂方法,而波特率、停止位、奇偶校验都是稍后提供的。 |
|
KiraHoneybee · 具有构造函数参数的模板化类 4 年前 |
|
|
nick2225 · 隐式调用复制构造函数? 4 年前 |
|
|
nohaga · 为什么在本例中p3需要默认构造函数? 4 年前 |
|
|
Aadil Hoda · 为什么类类型的成员需要初始化? 4 年前 |
|
|
EloiGG · 具有任意类型的变量的可数的C++函数 4 年前 |