五流!!日曜プログラマーのつどい - デザインパターン

デザインパターンについて

デザインパターンとはオブジェクト指向のプログラミングで開発する際にプログラムの組み方の方法の仕方をまとめたもの.
javaやc++といったオブジェクト指向の言語を使うプログラマーなら知っていて損はないし,人にプログラムを説明するときや,されるときに使用すると便利なので暇なら覚えましょう.

出来れば自分でまとめたかったけどわかりやすくまとまったサイトがあったので紹介をします.
http://cafe.eyln.com/cgi-bin/wiki/wiki.cgi?page=%A...

このサイトでは各パターンの長短などが分かりやすいことに加え,java,c++のコード(ソースコードはJavaをクリックするとjava,c++両方のコードが見れます.)を紹介しているので勉強する際参考にするといいと思います.

その他勉強のため参考にしたサイト
「デザインパターン編 トップページ」 http://www.geocities.jp/ky_webid/design_pattern/in...
プログラムが一番簡単なものを紹介しているが,UML図はない.たまに他の参考サイトと違う組み方(stlを使って)を行っているときがあるのでたまに悩んだりしたが,説明と感じを掴むのには参考になる.

「PHPによるデザインパターン入門」 http://www.doyouphp.jp/book/book_phpdp.shtml
phpによるデザインパターン入門という本を執筆した人が本の中身をhtmlに書き直して載せている(理由はトップページ参考してください).phpは読めないがumlのクラス図が載ってあるので参考にできる.

「デザインパターンの骸骨たち」 http://www002.upp.so-net.ne.jp/ys_oota/mdp/index.h...
c++,c言語,javaのプログラミング例が掲載されており,またUMLクラス図もある.

上記のサイトなどを見てクラス図など載っているものに差があったりするので少し悩むかもしれませんが大体このくらいのサイトと手元の本を参考に勉強しています.

パターンの分類

主に自分用に書いているのでわかりにくいかも知れない.
パターンの意味を直感的にわかり易くパターン名と直訳と特徴をまとめてみた.

全体の種類わけ.

生成に関するパターン構造に関するパターン振る舞いに関するパターン
Abstruct FactoryAdapterChain of ResponSibility
BuilderBridgeCommand
Factory MethodCompositeInterpreter
PrototypeDecoratorIterator
SingletonFacadeMediator
FlywightMemento
ProxyObserver
State
Visitor

パターンの特徴

生成に関するパターン
パターン名直訳特徴
Abstruct Factory仮想工場作成するクラス群のインタフェースを提供し,
具象クラスを独立させ変更を容易にする.
Builder建築者オブジェクトの生成過程を抽象化し動的にオブジェクトを生成.
Factory Method工場 法インスタンス化をサブクラスに任せる.->オブジェクトの生成が柔軟化
Prototype原型(原型)オブジェクトをクローンすることで新しいオブジェクト生成
Singleton1個のものインスタンスが一つであることを保証
構造に関するパターン
パターン名直訳特徴
Adapter適合させる再利用のためのインタフェース変換.
(インタフェースに互換性のないクラス同士を組み合わせる.)
Bridge機能と実装を明確に分離し,
機能を提供する部分とその機能を実現するの実装クラスを橋渡しするパターン.
->機能の変更が容易になる.
Composite混合体再帰的なオブジェクト構造(木構造)を表現.
Decorator装飾者動的にオブジェクトに機能(責任)を追加
Facade正面窓口サブクラス内に存在する複数のインターフェースに
統一インターフェースを提供.
Flywightフライ級(軽い)オブジェクト共有によるメモリの節約.
Proxy代理/入れ物コストの高いオブジェクト生成を最小化.
ネットワーク上のオブジェクトに対する参照.
(オブジェクトへのサクセス制御.)
振る舞いに関するパターン
パターン名直訳特徴
Chain of ResponSibility責任の鎖要求に応じる役割をチェーン上に繋げ,
処理を連鎖的に実行する.
Command命令命令のカプセル化する.
->要求そのものをパラメータとして他のオブジェクトに渡すことが可能にする.
Interpreter翻訳者文法表現とその文の解釈するためのミニ言語を作る.
(文法表現とはある規則に則った文字列.)
構文木を作っていく.
Iterator反復する(反復子)複数の要素に順番にアクセス.
(集約オブジェクトが基にある内部表現を公開しない.)
Mediator仲介者オブジェクト郡の相互作用をカプセル化するオブジェクトを定義する.
オブジェクト同士の結合度を低め,
オブジェクト同士の相互作用を独立に変更できるようにする.
Memento記憶/思い出オブジェクトの内部情報保存し,状態を復元できるようにする.
ただしカプセル化を壊さない.
Observer観察者オブジェクトの状態変化を依存する全てのオブジェクトに自動的に通知.
一対多の依存関係の定義.
State状態オブジェクトの状態に合わせて動作を変更.
Strategy戦略アルゴリズムのカプセル化し変更,交換可能にする.
アルゴリズムを独立することにより可能にする.
Template Method鋳型コードの再利用のための基本方法.
親がサブクラスの関数を呼ぶ.
特定の処理をサブクラスで行う.
Visitor訪問者構造と処理を分離.
->新しい操作を簡単に追加.
->共通操作の局所化


個人の感想

また今度,パターンの関係を調べてまとめていきたい.

わかりやすさという点で学んだパターンをカテゴリわけします.
わける尺度は,導入目的と内容のわかりやすさで分別します.

わかりやすいパターン.

Facade  : 一番わかりやすいパターン.
adapter : 使用する目的が分かりやすい.

そこそこわかりやすい.

composite : 目的はわかりやすいが,実装がめんどくさそう.
Singleton : 同上.