这段代码的目的是什么?
问题描述:
我奋力理解为什么pprocessor的初始化,下面,是这样写的:这段代码的目的是什么?
class X
{
...
private:
boost::scoped_ptr<f_process> pprocessor_;
};
X:X()
: pprocessor_(f_process_factory<t_process>().make()) //why the factory with template
{...}
,而不是仅仅写
X:X()
: pprocessor_(new t_process())
{...}
其他相关代码:
class f_process {
...
};
class t_process : public f_process {
...
};
//
class f_process_factory_base {
public:
f_process_factory_base() { }
virtual ~f_process_factory_base() = 0 { }
virtual f_process* make() = 0;
};
template < typename processClass >
class f_process_factory : public f_process_factory_base {
public:
f_process_factory() { }
virtual ~f_process_factory() { }
virtual processClass* make() { return new processClass(); }
};
编写代码的人非常聪明,所以也许有一个很好的理由。
(我不能联系他问)
答
由于它是,它似乎有点毫无意义,但我认为这里没有显示的几个可能的用途,但可能在未来有用:
内存管理:这是可能在未来的某个时刻,原作者预计需要
t_process
的不同分配方案。例如,他可能想要重用旧对象或从竞技场分配新对象。创建跟踪:创建对象时可能会收集
f_process_factory
对象的统计信息。也许工厂可以保持一些静态。绑定构造函数的参数:也许在未来的某个时候,
f_process_factory
为t_process
的专业化需要通过构造函数的参数为t_process
创造者,但X
并不想知道他们。为依赖注入做准备:可能会专门化这些工厂来返回模拟,而不是真正的
t_process
。这可以通过几种方式来实现,但不完全如书面。专门创建对象:(这实际上只是前两个一般情况下),可能是获得在不同情况下产生的
t_process
特 - 例如,它可能会产生不同的t_process
类型的基于环境变量或操作系统。这需要工厂的专业化。
如果是我的话,并没有这些看似有理,我可能会撕了出来,因为它似乎是无偿的设计模式的使用。
答
那么,在这种情况下,它没有多大意义,除非作者期望默认工厂的定义将在将来的某个时间更新。但是,如果工厂对象作为参数传入,那将是有意义的;工厂为您提供了构建对象的更多灵活性,但是如果您在与使用工厂相同的地方实例化工厂,那么它确实不具备优势。所以,你是对的。
除了它不创建不同类型的't_process'。它调用一个调用'new t_process();'的't_process'工厂,'t_process'类是具体的。 – Stephen 2010-07-23 04:06:58
你怎么能确定它使用的工厂,如果有多个工厂呢?所有的工厂方法都不是静态的。它可能指向与示例代码中提到的不同的类,并使用多态性创建流程实例。 – 2010-07-23 04:19:55
我可以肯定,因为它在'pprocessor_'的初始化中构建了一个临时't_process'工厂,然后调用'make()':) – Stephen 2010-07-23 04:22:46