代码之家  ›  专栏  ›  技术社区  ›  hamishmcn

这个准则的目的是什么?

  •  1
  • hamishmcn  · 技术社区  · 16 年前

    我很难理解为什么下面的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(); }
    };
    

    写代码的人非常聪明,所以也许有一个很好的理由。

    3 回复  |  直到 16 年前
        1
  •  2
  •   Stephen    16 年前

    事实上,这似乎有点毫无意义,但我可以想到一些可能的用途,这里没有显示,但在未来可能有用:

    • 内存管理: t_process . 例如,他可能希望重用旧对象或从竞技场分配新对象。

    • 跟踪创建: 可能有统计数据由 f_process_factory

    • 绑定构造函数参数: 也许是一种 f\加工厂 对于 在将来的某个时候,需要将构造函数参数传递给 创造者,但是 X 不想知道他们的事。

    • . 这可以通过几种方式实现,但不完全是书面形式。

    • (这实际上只是前两个的一般情况),可能有 t\U过程 在不同的环境下产生的——例如,它可能会产生不同的 基于环境变量或操作系统的类型。这需要工厂的专业化。

    如果是我,这些听起来都不可信,我可能会把它撕掉,因为这似乎是无缘无故的设计模式用法。

        2
  •  2
  •   Rohan West    16 年前

    看起来他在用 factory design pattern

        3
  •  1
  •   Michael Aaron Safyan    16 年前

    好吧,在这种情况下没有什么意义,除非作者希望默认工厂的定义在将来某个时候会更新。不过,如果factory对象作为一个参数传入,这是有意义的;工厂在构造对象时提供了更大的灵活性,但是如果您在使用工厂的同一位置实例化工厂,那么它就没有什么优势了。所以,你是对的。