ZF2で「SessionManagerをServiceとしてServiceManagerに登録する」みたいな処理をしている内に、ServiceとManagerの違いが分からなくなってきたので、ちょっと整理。
Service
何らかの機能を提供する、複雑な状態を持たないオブジェクト。
何らか、の部分は何でもいい。
たとえばログの出力だったり各種設定の管理だったりする。
複雑な状態を持たないため、Entityのようにいちいち生成すると資源の無駄遣い。
なのでServiceManagerに登録することで、アプリケーション中で使い回せるようになっている。
Manager
読んで字のごとく、何かの管理を担当するオブジェクト。
何か、の部分にはServiceやModule、セッション、プラグイン(Helper)などが該当する。
ソフトウェアアーキテクチャ上でManagerという何か特殊な役割を持ったコンポーネントが存在するわけではない。
- ServiceManager
- Serviceを管理する。
- 必要に応じてServiceを生成し、生成したServiceを使い回せるように保存しておいたりする。
- ModuleManager
- Moduleを管理する。
- Moduleをロードし、各種Moduleイベントを発生させる。
- SessionManager
- セッションを管理する。
- セッションの開始や破棄など、セッションを操作するための機能を提供する。
上記の例においてServiceManagerは「Serviceを管理する、という機能を提供するService」ではあるが、その役割上、他のServiceとは異なりアプリケーション中に単一のインスタンスしか存在し得ない。
一方、ModuleManagerやSessionManagerは「何かを管理する機能を提供するService」としてServiceManagerに登録し、アプリケーション中で単一のインスタンスを使い回す、ということがありえる ※。
※ 別にServiceManagerに登録しなくてもいいけど、全く同じManagerを複数箇所で利用する場合はいちいちnewするよりも登録しといたほうが効率がいい。