Hatena::ブログ(Diary)

独学ActionScript このページをアンテナに追加 RSSフィード

2009.11.27

【デザパタ入門】GoFによる23パターンの概要・分類・使用頻度

先日のユニットテスト(リファクタリング)と同様に、デザインパターンにも興味があってネットや書籍で調べたりしていて、この2つはお互いに補完しあっている感じで、片方を学ぼうとするともう片方が出てくる(必要になる)気がします。で、このデザインパターンについて大雑把に知るのにとても適した情報(以下の書籍に掲載されている数ページ)があったのでメモ。GoFによる23個のデザインパターンについて、使用頻度の高い順≒使える順(?)で各パターンを紹介していて、その順位が個人的にとても参考になりました。右も左も良くわからない状態で、目の前に23個も選択肢があったら、とりあえずはよく使われているものから学んでいきたいと思いますよねw

独習デザインパターン

独習デザインパターン

ちなみに、それぞれのパターン自体の解説については、デザパタ入門書の定番として有名な「【送料無料】Java言語で学ぶデザインパタ-ン入門増補改訂版」の方がわかりやすいと思いました。


GoFによる23パターンの使用頻度が高い順番とその概要

以下の表は、前述の「独習デザインパターン」という書籍が採用している章立てと、同じく本書内で記載されているそれぞれのデザインパターンの概要を併せて表にしてみたものです。本書では各デザインパターンの並び順(章立て)が「実際の開発現場で使われている機会が多いとされる順」になっており、自分のような初心者がどのパターンから学び始めるか迷うことがないようにしてあります。

ただし、注意点が2つあり、1つは本書はJava向けに書かれているので、ActionScript 3.0の場合だとこの順位は変わってくるかもしれないということと、もう1つは、開発現場で使われる機会が多い順であり、規模が不明で小数や個人ベースだとその場合も使用頻度は変わってくる可能性があるということです。それを踏まえた上でも、これからデザインパターンを学んでいく上での指針・目安としては十分に役立つ情報だと思いました。

使用頻度が高いパターン
1 シングルトンSingleton システム内に存在するオブジェクトが1つであることを保証する。
2 ファクトリメソッドFactory Method) インターフェースを利用することで、直接具象クラスを明示してオブジェクト生成を行う必要をなくす。
3 アブストラクトファクトリAbstract Factory 関連するオブジェクトの生成方法をグループ化し、具体的なオブジェクトを特定せずに生成するためのインターフェースを提供する。
4 テンプレートメソッド(Template Method) スーパークラスのメソッドで手順を決めておき、順番に呼び出されているメソッドについては、実装をサブクラスに任せることにする。
5 イテレータIterator 集約オブジェクト内の個々のオブジェクトアクセスするための統一化された手段を提供する。
使用頻度が中程度のパターン
6 コンポジットComposite 集団を表現するオブジェクトと要素を表現するオブジェクトを同じように扱えるようにする。
7 アダプターAdapter インターフェースの変換を行うことによって、互換性のないクラスを利用できるようにする。
8 コマンドCommand クライアントからの要求をオブジェクトを用いてカプセル化する。何かを行うタイミングはわかるが、具体的な処理内容がわからないときに使用する。
9 ファサードFacade サブシステムへの統合されたインターフェースを提供することによって、サブシステムの利用方法を簡素化する。
10 ステート(State) 各状態における振る舞いを記述した状態オブジェクトを導入する。状態によって変化する振る舞いをクラス内に記述する必要がなくなり、状態オブジェクトに処理を任せることができるようになる。
11 オブザーバー(Observer) あるオブジェクトが状態を変えたときに、そのオブジェクト依存するオブジェクトに自動的に状態変更が通知され、その依存オブジェクトが更新されるまでの仕組みを提供する。
12 ストラテジー(Strategy) アルゴリズムの集合を定義して実装をカプセル化しておき、クライアント側に影響を与えずにアルゴリズムを変更・交換できるようにする。
13 プロキシProxy WebサーバーDBサーバーなどにアクセスするプログラムを開発するときの便宜を図る。
使用頻度が低いパターン
14 ビルダーBuilder オブジェクトの生成処理を担当するクラスを作成し、様々な生成処理を行えるようにする。
15 ブリッジBridge 抽象的なインターフェースを2つに分割し、それぞれを自由に変更できるようにする。
16 メディエータMediator オブジェクト間の複雑な協調関係を集中管理するオブジェクトを定義する。これによりオブジェクト同士の結合度を弱め、柔軟性を保つことができる。
17 チェーンオブレスポンシビリティ(Chain of Responsibility) クライアントからの要求を処理できるオブジェクトをチェーンでつなぎ、そのチェーン中の任意のオブジェクトが要求を処理するようにする。
18 デコレータDecorator オブジェクトに動的に機能を追加するための構造を提供する。サブクラス化による機能追加より柔軟な方法である。
19 ビジター(Visitor) クラスの要素を変更せずに、新しい操作を定義できるようにする。
20 プロトタイプPrototype サンプルをコピーして生成したオブジェクトクライアントに提供する。
21 フライウェイトFlyweight 粒度オブジェクトを共有することで、オブジェクトの格納コストを減少させる。共有されるオブジェクトは使用状況に依存してはならない。
22 メメントMemento カプセル化を侵害しない方法でオブジェクトの内部状態を保存し、後でその状態に戻れるようにする。
23 インタープリタInterpreter 言語の文法をオブジェクトで表現し、そのオブジェクトを用いてその言語の文を解釈する。

「目的別」と「範囲別」に分類したデザインパターン

こちらは、同書に記載されているデザインパターンを「目的別」と「範囲別」に分類した一覧表を引用したものです。パターンの名前だけ聞いてもイメージが沸きにくいですが、前述の概要と併せて、この分類を見ることでどのようなものかおおよそのイメージができると思いました。

目的
生成 構造 振る舞い
範囲 クラス ファクトリメソッド アダプター(クラス インタープリタ

テンプレートメソッド

オブジェクト アブストラクトファクトリ

ビルダー

プロトタイプ

シングルトン

アダプター(オブジェクト

ブリッジ

コンポジット

デコレータ

ファサード

フライウェイト

プロキシ

チェーンオブレスポンシビリティ

コマンド

イテレータ

メディエータ

メメント

オブザーバー

ステート

ストラテジー

ビジター

「生成」に関するパターンでは、オブジェクトを生成する処理を扱います。

「構造」に関するパターンでは、クラスまたはオブジェクトの静的な構成を扱います。

「振る舞い」に関するパターンでは、クラスまたはオブジェクトの通信方法を特徴付け、責任を分担させる方法を扱います。

クラスに関するパターンでは、クラスサブクラスとの関連を扱います。これらの関連は継承によって確立され、コンパイル時に確定される静的な関係です。

オブジェクトに関するパターンでは、オブジェクト間の関連を扱います。これらの関連は実行時に変更できる動的な関係です。

独習デザインパターン

これらの情報を参考に、とりあえずは使用頻度が高いパターンあたりを重点的に学んでいこうと思います。


Flash/AS3でよく使われるデザインパターンについて(2009.11.28 00:51 追記)

この記事を書いてから、Twitterやブックマーク、コメント欄などでFlasherな方々にデザインパターンについてコメントやアドバイスをいただきました*1ので、個人的に忘れないためにも引用させていただきました。Twitterなどでは、こういった実際に使用されている方々のお話を直接聞けるのが、本当にありがたいですしとても参考になります。素敵情報に感謝!

doke: @dkgkAs オブザーバーとイテレーターが内部的には大活躍なんですけどね。あとプロキシーとか。

doke: progつかうとテンプレートとコマンドが上位みたいな。実装だとファサードとビルダーが実は多い気がする。

clockmaker_core: 自分は、結局シングルトンが一番使用頻度多いけど、アプリ系のものを作るときはメメントやコマンドを積極的に使用してる感じかな

clockmaker_core: MXMLのscriptタグにシングルトン埋め込んで、どこからでも参照可能な感じにするのが即興俺々アプリ作る際の極意なり(仕事だとちゃんとやるYO)

coppieee: Factory Method, Decorator, Iterator, Singletonあたりか。私がよく使うの。

sKSKe: @dkgkAs SingletonJavaに限らずよく使われますが、状態が埋め込まれてユニットテストがしづらいとか、機能の分離が出来ていないとか批判もあるので難しいですね。

func09: 僕的にはmediatorがFlashで一番使えるパターン

alternadotin: 基本的に参照先がひとつでいいように作るのでシングルトンっぽいアプローチが多いかもしれない。

re_shikajiro: デザパタは結城さんの「増補改訂版Java言語で学ぶデザインパターン入門」http://www.hyuki.com/dp/ がぶっちぎりでおすすめです。

matsumos: @dkgkAs プロキシパターンの説明に違和感が・・・ 代理みたいなもんだったと思います

dkgkAs: @matsumos ふむふむ。確かにWikipediaの説明とか見るとなんか違う感じがしますね http://j.mp/14dFm

sKSKe: GoF本だとProxyパターンの説明が遅延評価の実現っぽく書かれてるんだよなぁ。virtual proxyらしいけど。まぁ、HTTPのproxyみたいなものといえばそうなのかな……。

coppieee: Proxyパターンは、データの読み込みや生成に時間がかかる場合に、とりあえず仮のオブジェクトを作っておいて読み込みが終わるまでそいつに任せるようなイメージ。

bkzen: @dkgkAs さんのブログを見て、自分が使っていたパターンはこういう名前がついていたんだということを知ったw

bkzen: @dkgkAs シングルトン、ファクトリ、テンプレートイテレータ、コマンド、ステート、辺りをよく使います。

bkzen: @dkgkAs あ、ちなみにシングルトン、プロキシーぐらいしか名前知りませんでしたw

coppieee: デザインパターン紹介 ―GoF以外のパターンを紹介します― 結城浩 http://www.hyuki.com/dp/dpinfo.html

(順不同、敬称略)

もしこれをご覧になって、「自分はこのパターンをよく使うよ!」とか「これはFlash/AS3向きだよ!」などありましたら、是非教えていただけると嬉しいです。

*1:「ただつぶやいただけ!」というツッコミはご容赦くださいw

re_shikajirore_shikajiro 2009/11/27 01:52 デザパタは結城さんの「増補改訂版Java言語で学ぶデザインパターン入門」http://www.hyuki.com/dp/ がぶっちぎりでおすすめです。

ActionScriptActionScript 2009/11/27 11:35 コメントありがとうございます!
本文内でちょっと触れていますが、ちょっと読んだ感じでは私も結城先生の本の方が個々のパターンの解説はわかりやすいとおもいました。
まだどちらも全部は読めておらず、こういうのは何度も読まないと理解できないので、あらかじめオススメしていただけたのはありがたいです。
これからデザパタ関連で学んだことをブログやTwitterに書いていこうと思っていますので、またコメント欄やTwitterなどで色々教えてくださいませ!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/ActionScript/20091127/gof_23_design_pattern