我正在构建一个C++应用程序,并且我有几个实用程序对象,我的所有类都需要使用它们.这些是日志记录对象,全局状态对象,DAL对象等...
到目前为止,我已经将所有这些对象作为引用传递给我的类构造函数.
例如:
class Honda : public Car { public: Honda ( const GlobalState & state, const Log & logger, const DAL & dal ); ... private: const GlobalState & my_state; const Log & my_logger; const DAL & my_dal; }
这很快就会变得乏味,因为每次我添加一个我所有类都需要访问的实用程序对象时,我都必须在各处更改构造函数.
我听说解决这个问题的正确方法是创建一个包含所有不同实用程序对象的结构,并将其传递给所有需要访问它的对象(作为参考).
这是处理这个问题的正确方法吗?谢谢!
更新:感谢大家的反馈.经过一些额外的研究,我决定继续使用依赖注入.
您可以使您的GlobalState,Log,DAL类单例:
class GlobalState { public: static GlobalState& getInstance(); protected: GlobalState(); GlobalState(const GlobalState&); GlobalState& operator= (const GlobalState&); private: static GlobalState* p_instance; }; static GlobalState* GlobalState::p_instance = NULL; /*static*/ GlobalState& getInstance() { // TODO: acquire lock if multi-threaded if (!p_instance) { // first time? p_instance = new GlobalState(); // create sole instance } // TODO: release lock if multi-threaded return *p_instance; // sole instance }
然后,在你的各种方法里面,
Honda::MyMethod() { ... const GlobalState& my_state = GlobalState::getInstance(); ... }
通过在特定条件下定义单例C++模板(例如,所有类的构造函数采用相同数量和类型的参数等),您可以进一步简化您的生活(并减少代码重复的数量).
您可以使用服务定位器模式.本文介绍了依赖注入(您当前使用的)和服务定位器.
但是,请考虑这一点:依赖注入的想法是建立一个系统,其中每个组件都有明确的责任,并尽可能减少对其他组件的了解.如果组件需要其他组件来完成其工作,那么这些组件将显式传递给它.这使得组件更易于理解,更可能是正确的,并且更易于维护.
如果您经常需要添加整个系统中需要知道的组件,那么系统的设计可能会出现问题(或者新功能的添加方式).依赖注入模式只会导致此问题明确可见.