| デザインパターンを“喩え話”で分かり易く理解する。 |
| オブジェクト指向に立脚する優れた設計ノウハウである “デザインパターン”。 喩え話や、クラス設計のポイントだけ記載した、 本格的な勉強の前の入門編。 |
| 目次に戻る |
| ファクトリー・メソッド |
| ある製品種を扱う工場で、 具体的にどのスタイルの製品を作るかを指定できる窓口。 |
| 同じ種類のモノなら、同じように作れるようにしておけ。 |
| Factory |
| createProduct(discriminator):Product |
| 目次に戻る |
| アブストラクト・ファクトリー |
| 同じ「一揃いの製品群」を、違う「スタイル」で作る複数の工場を、 自由に選べるようにする。 |
| 同じ種類のモノ一式なら、同じように作れるようにしておけ。 |
| AbstractFactory |
| getFactory(discriminator):Factory |
その工場に、個々の製品を作ってもらう。
| ConcreteFactory1 |
|
createProductA():ProductA createProductB():ProductB … |
利用者は、 異なるワンセットの製品群を生産する工場を指定しても、 利用方法を変更する必要はない。 製品(ProductA、ProductB)だけでなく、 製品を生産する工場(Factory)も抽象化しているのがポイント。
| 目次に戻る |
| ビルダー |
| 製品の複雑な作り方を利用者から隠す。 |
| 個々の「部品の作り方」と、部品を組み立てる「作業の流れ」は、分けておけ。 |
| AbstructBuilder |
|
getInstance(discriminator):AbstructBuilder buildPart1() buildPart2() … getProduct():Product |
そして利用者は、第二に、ディレクタ(作業監督者)に、 ビルダを引き渡す。すると、製品が出てくる。
| Director |
| Build(builder:AbstractBuilder):Product |
監督者は、ビルダが持っている各部分の製造メソッド (buildPart1、buildPart2、…)を呼び出しながら製品を仕上げ、 最後にgetProduct()で成果物を得て、利用者に返す。
| 目次に戻る |
| プロトタイプ |
| いつでも使える複製方法を提供する。 |
| 最初からでなく、苦労して色々いじった結果を、増殖できるようにしておけ。 |
| Prototype |
| clone():Prototype |
| 目次に戻る |
| シングルトン |
| 実物が一つだけしか生成されないことを保証する。 |
| 一つだけ必要なモノは、一つしか作れないようにしておけ。 |
| Singleton |
|
《constructor》 -Singleton() 《misc》 +getInstance() |
Singletonのコンストラクタは privateにしておき、 インスタンスを得るgetInstance()の方をpublicにしている、 という可視性の設定がミソ。 Singletonクラスは、自分自身のインスタンスを保持する static変数を内部に持っており、 getInstance()は、既に自分を生成したことがあればそれを返却し、 そうでなければ生成してからstatic変数に代入した上で返却する。
| 目次に戻る |
| オブジェクト・プール |
| オブジェクトを 取っておいて、必要に応じて使いまわす。 |
| 作るのが大変なものは、使い終わっても捨てずにとっておけ。 |
| ReusablePool |
|
《constructor》 -ReusablePool() 《misc》 +getInstance() +acquireReusable():Reusable +releaseReusable(:Reusable) +setMaxPoolSize(maxSize:int) … |
| 目次に戻る |
| コンポジット |
| 「親は一人、子供は複数」という決まりで、 木構造を作る。 |
| 「束ねる側」と「束ねられる側」の共通部分は纏めておけ。 |
| AbstractComposite |
|
operation() add(AbstructComponent) remove(AbstructComponent) getChild(int) |
| 目次に戻る |
| アダプター |
| 利用者が知らない機能を呼び出してくれる窓口。 |
| 「既に知っているモノ」を拡張して、「知らないモノ」を利用できるようにしておけ。 |
| Adapter (extends Target) |
| operation() |
| 目次に戻る |
| イテレータ |
| オブジェクトに順々にアクセスする。 |
| 複雑な構造のモノの集まりでも、一個一個、順番に取り出せるようにしておけ。 |
| Iterator |
|
hasNextItem():boolean getNextItem():InventoryItem |
| 目次に戻る |
| ファサード |
| 汚いものに綺麗なフタをする。 |
| 複雑なモノは、簡単に利用できるようにしておけ。 |
| 目次に戻る |
| フライウェイト |
| 同じオブジェクトがワラワラ出来るのを防ぐ。 |
| 繰り返し使われると分かっているモノは、一回しか作らないようにしておけ。 |
| FlyweightFactory |
| getFlyweight(attribute:object) |
| 目次に戻る |
| デコレータ |
| ある機能に、基本的な使い勝手は変えずに 装飾を加えていく方法を提供する。 |
| 既に存在するモノをいじらずに、機能を拡張できるようにしておけ。 |
| AbstractWrapper |
| -wrappee:AbstractService |
|
《constructor》 AbstractWrapper(wrapee) 《misc》 Operation() Operation2() … |
| 目次に戻る |
| プロキシ |
| 実装方法の実体を利用者から隠す |
| 利用者に分からないように、処理の呼び出し方を調整できるようにしておけ。 |
| 目次に戻る |
| ブリッジ |
| 実装方法と機能を別々に拡張できるようにする。 |
| 「何をするか」と「どう実現するか」は、分けておけ。 |
| 目次に戻る |
| チェイン・オブ・レスポンシビリティ |
| 依頼された処理をたらい回しする。 |
| 既に存在する機能に、簡単に機能を追加できるようにしておけ。 |
| CommandHandler |
|
postCommand() handleCommand():boolean |
| 目次に戻る |
| コマンド |
| 命令書をキューに溜めて、一つ一つ取り出して処理する。 |
| 「要求内容」と、「要求の処理」は、分けておけ。 |
| 目次に戻る |
| メディエータ |
| 各々が勝手に機能を呼び合うのでなく、 必ず媒介者(仲人)を通して通信するようにする。 |
| 個々に勝手に通信先と話をせず、仲介人に通知先を判断してもらうようにしておけ。 |
| Mediator |
|
registerColleague1(Colleague1) registerColleague1(Colleague2) … handleEvent1() handleEvent2() … |
| 目次に戻る |
| スナップショット |
| ある瞬間の状態を保存する。後でその状態に戻せる。 |
| 状態の「保存・復旧処理」と、保存された状態の「履歴・世代管理」は、分けておけ。 |
| Originator |
|
CreateMemento():Memento setMemento(Memento) |
| 目次に戻る |
| オブザーバー |
| ある物の状態の変化を、関係する全員に通知する。 |
| 一貫性を保てるよう、変化が起きたら全員に通知できるようにしておけ。 |
| Multicaster |
|
addObserver(:ObserverIF) removeObserver(:ObseverIF) notifyObservers() |
| 目次に戻る |
| ステート |
| 個々の状態と、その状態に対する動作を、クラスとして表わす。 |
| 状態ごとに、各種イベントに対する「処理内容」と、「処理後の状態」を、纏めておけ。 |
| ContextState |
|
+event1:int = 1{frozen} +event2:int = 2{frozen} … #state1:ConcreteState1 #state2:ConcreteState2 … |
|
+operation1() +operation2() … #enter() +start() : State +processEvent(event:int):State |
| 目次に戻る |
| ストラテジー |
| 対象に応じたアルゴリズムが実行されるようにする。 |
| 相手によって適切な処理が選ばれるようにしておけ。 |
| AbstractStrategy |
|
operation1() operation2() : |
| 目次に戻る |
| テンプレート・メソッド |
| 大筋のアルゴリズムを定義しておき、詳細ロジックはサブクラスの実装に委ねる。 |
| 不変の大まかな「処理の流れ」と、良く変わる細部の「処理」は、分けておけ。 |
| AbstractTemplate |
|
templateMethod() … #operation1() #operation2() … |
| 目次に戻る |
| ビジター |
| オブジェクト構造の中を巡回し、 個々の要素の型に応じて適切な処理を行う。 |
| 複雑なモノの集まりに対して、将来、新しい観点での巡回が出来るようにしておけ。 |
| AbstractVisitor |
|
visit(:Element1) visit(:Element2) … |
| AbstractElement |
|
accept(:AbstractVisitor) … |
| 目次に戻る |
| インタープリタ |
| 言語の文法構造を木構造で表現する。 |
| 「対象」と「対象間の関係」の共通部分は纏めておけ。 |
| 目次に戻る |