这段代码的目的是什么?

问题描述:

我奋力理解为什么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_factoryt_process的专业化需要通过构造函数的参数为​​t_process创造者,但X并不想知道他们。

  • 为依赖注入做准备:可能会专门化这些工厂来返回模拟,而不是真正的t_process。这可以通过几种方式来实现,但不完全如书面。

  • 专门创建对象:(这实际上只是前两个一般情况下),可能是获得在不同情况下产生的t_process特 - 例如,它可能会产生不同的t_process类型的基于环境变量或操作系统。这需要工厂的专业化。

如果是我的话,并没有这些看似有理,我可能会撕了出来,因为它似乎是无偿的设计模式的使用。

这看起来像他正在使用factory design pattern来创建t_process的新实例。这将允许你将创建不同类型的t_process的责任从类X中移除

+0

除了它不创建不同类型的't_process'。它调用一个调用'new t_process();'的't_process'工厂,'t_process'类是具体的。 – Stephen 2010-07-23 04:06:58

+0

你怎么能确定它使用的工厂,如果有多个工厂呢?所有的工厂方法都不是静态的。它可能指向与示例代码中提到的不同的类,并使用多态性创建流程实例。 – 2010-07-23 04:19:55

+0

我可以肯定,因为它在'pprocessor_'的初始化中构建了一个临时't_process'工厂,然后调用'make()':) – Stephen 2010-07-23 04:22:46

那么,在这种情况下,它没有多大意义,除非作者期望默认工厂的定义将在将来的某个时间更新。但是,如果工厂对象作为参数传入,那将是有意义的;工厂为您提供了构建对象的更多灵活性,但是如果您在与使用工厂相同的地方实例化工厂,那么它确实不具备优势。所以,你是对的。