Facadeパターンというものがあるんですが、一言で言えば、
「複数の(低水準な)オブジェクトをまとめて扱えるような(高水準な)窓口用クラスを作る」
というものです。
HeadFirstデザインパターンから例を引用すると、
低水準なコンポーネントである
アンプ、スピーカー、プロジェクタ、照明、・・・
といったものを、
高水準クラスである"ホームシアター"で一気に調整する、とかそんな感じです。
HeadFirstデザインパターンでは、
Facadeを使うクラスが、Facadeクラスに低水準コンポーネントを渡す、
という形で説明されています。
したがって、高水準な機能だけでは実現できないような"微調整"が必要なときには、
低水準コンポーネントに直接アクセスすることが可能である、と説明されています。
つまり、Java風擬似コードで言うとこうです。
class FacadeUser{ ... func(){ ... LowLevelComponent1 comp1 = new LowLevelComponent1(); LowLevelComponent2 comp2 = new LowLevelComponent2(); Facade facade = new Facade(comp1, comp2); ... } ... } class Facade{ LowLevelComponent1 comp1; LowLevelComponent2 comp2; // constructor Facade (LowLevelComponent1 comp1, LowLevelComponent2 comp2){ this.comp1 = comp1; this.comp2 = comp2; ... } ... }一方、wikipediaなんかでは、
Facadeとなるクラスの中で、privateに低水準コンポーネントを作る、ということをしています。
したがって、Facadeを使う側は、直接低水準コンポーネントを触れない、というわけです
(setterやgetterを作れば別ですが)。
特に、日本語版wikipediaでは低水準コンポーネントを隠蔽する点にしっかり言及しています。
擬似コードだとこんなです。
class FacadeUser{ ... function(){ Facade facade = new Facade(); ... } ... } class Facade{ private LowLevelComponent1 comp1; private LowLevelComponent2 comp2; // constructor Facade (LowLevelComponent1 comp1, LowLevelComponent2 comp2){ this.comp1 = new LowLevelComponent1(); this.comp2 = new LowLevelComponent2(); ... } ... }
隠蔽するかしないかで、クラス図的にはほぼ同じでも、
正直相当違うんじゃないかと思うのですが、どうなんですかねえ。
どっちが正解とかそういうことは無いとは思うのですけども、
せっかく名前をつけている以上はっきりしておいてもらいたいなあと思います。
ま、そもそもFacadeパターンなんて、
わざわざ言われなくても勝手に使っているものにしか見えない、というそもそもの問題がありますが。
この辺の「何をいまさら」感は、Template methodパターンとどっこいどっこいでしょう。
0 件のコメント:
コメントを投稿