2

我刚刚读了一本关于面向对象编程模式的书。它描述了一种工厂模式,您可以通过该模式调用对象的静态工厂方法,并且该对象将返回预期类型的​​新对象,但它将被适当地子类化。

我的问题,这个功能可以由类的构造函数提供吗?如果有怎么办?我不是为什么?想象一下,我有一个名为 VillagePerson 的类,它有子类 PoliceOfficer、NativeAmerican、Cowboy、Biker、ConstructionWorker 和 Sailor。构造函数获取人员的文本字符串描述,对其进行解析,然后返回我想要的特定类型的人员。这仅适用于静态工厂方法吗?

4

2 回答 2

3

不。通常,构造函数是由语言自动调用以初始化正在创建的对象的函数。这本身就意味着工厂的“调用我来创建对象”功能不能由构造函数提供。

此外,构造函数通常从表达式中调用,例如new ClassName(args)在大多数语言中定义为创建ClassName继承自的类的实例而不是类的实例ClassName。因此,您不能使用newor 构造函数来创建任何类型的实例。

另一方面,我确实说过“在大多数语言中”:有些语言,比如 JavaScript,可以让你从构造函数中返回任何你想要的东西,而另一些,比如 Objective Caml,将构造函数视为工厂函数。

于 2010-07-16T14:50:00.370 回答
1

这是对 Steven Sudit 评论的转述

在上面创建一个代理VillagePerson

  • Proxy 实现与 相同的接口VillagePerson,但不从它继承任何实现代码。
  • 代理包含_vpImpl对子类 VillagePerson 对象的引用。
  • 当在代理上调用方法时,代理只是将调用传递给_vpImpl对象。

要构造一个子类VillagePerson,Proxy 的构造函数可以调用子类的特定构造函数,然后将其存储在_vpImpl.

于 2010-07-16T15:18:30.487 回答