asaのブログ

プログラミングの勉強まとめ

デザインパターンまとめ1

 デザインパターン(下の参考書)のコードが、とりあえず打ち終わったので復習を兼ねてまとめていきます。全部で23パターンあるので、全体をさらっとまとめて(一言程度)、22章だけ次で詳しくやろうと思います(お絵かきソフトを扱っているので)。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

 

 1.Iteratorパターン

  数え上げを行うときのパターン。何かの集合からオブジェクトを返すnextメソッドと要素が存在するか調べるhasNextメソッドが出てきます。馴染み深いので分かりやすかったです。

 2.Adapterパターン

 クラスを再利用して、別の少し違うものに適用するときに使うパターン。すでに作られたクラスがあってそれをAPIに適用させるという説明が一番しっくりきました。

 3.Template Methodパターン

 処理の枠組みをスーパークラスで定義して、具体的な処理をサブクラスで定義するパターン。処理の大枠をabstractで決めるというのは、便利ですし分かりやすいです。その後のパターンんでも、参考になりました。

    4.Factory Methodパターン

 先ほどのTemplate Methodパターンをインスタンス作成に適用したパターン。一個一個インスタンスのために記述していると分かりずらいですし、ばらばらになりがちです。よくやってしまいます。

 5.Singletonパターン

 インスタンスが1個しか作られないことを保証するパターンです。コンストラクタにprivate指定をしています。いじって欲しくないものにはprivate指定するという考え方を得られました。

 6.Prototypeパターン

 インスタンスのコピーが欲しいときに使うパターン。図形描写をコピーするのにクラスを使うより、インスタンスをコピーしたほうが早いというのには納得しました。

 7.Builderパターン

 インスタンスを組み合わせて複雑なインスタンスを組み立てるパターンです。Main側が使用されるメソッドを全部知らなくても、内部的に処理されて複雑なインスタンスが完成します。この考え方はその後の章でも見かけます。

 8.Abstract Factoryパターン

 関連する部品を組み合わせてオブジェクトを作るときに使うパターンです。特にインターフェースだけに注目して、そのインターフェースだけを使って、抽象的な製品を作るという点が大事です。

 9.Bridgeパターン

 機能の階層と、実装の階層をはっきり分けてしまうパターンです。分けた階層を橋渡しするのがこのBridgeパターンです。

 10.Strategyパターン

 アルゴリズムの切り替えを行うパターンです。戦略の切り替えをいろいろと試したいときにこのパターンは有用です。じゃんけんの手を考えるコードがありましたが、参考になりました。

 11.Compositeパターン

 入れ子を表現するパターンに当たります。中身と容器を同一視して再帰的な構造をつくるパターンです。

 12.Decoratorパターン

 元のオブジェクトにどんどん装飾を加えていって、目的にあったオブジェクトに仕上げるときに使うパターンです。飾りと中身を同一視して、インタフェースを統一しているので、「見やすい」というのが直感的な感想です。

 13.Visitorパターン

 データ構造をいろいろと処理しなければならないときに、クラスに全て書いていると、クラスが大きくなりすぎて分かりにくくなります。データ構造をあらわすクラスと、処理を分けて実装しているのがこのパターンの特徴です。

 14.Chain of Responsibilityパターン

 責任のたらいまわしという表現がとてもしっくりきます。ある要求が発生したときに、その要求を即座に決めることができるとは限りません。オブジェクトをチェーンのようにつないで、目的とするオブジェクトを決定するパターンです。

 15.Facadeパターン

 複雑に入り組んだたくさんのクラスを、窓口となるクラスに抽象化して、要求に対して入り口を一本化するパターンです。

 16.Mediatorパターン

 多数のオブジェクトを調整する必要があるときに、ここのクラスを結び付けていると記述が大変になるうえに、後で見返すのも大変になります。Mediatorという相談役を置いて、ロジックを一任させてしまうパターンです。

 17.Observerパターン

 このパターンでは、状態変化に応じてなんらかの処理をしなければならないとき、状態を観察するObserverを設けて処理を行わせます。

 18.Memetoパターン

 やり直しつまりアンドゥを行うときに使われるパターンです。インスタンスを復元する際には自由にインスタンスにアクセスする必要がありますが、その際にあちこちでそのクラスの構造に依存したコードになり、クラスの修正が困難になります。これをカプセル化の破壊といいます。このパターンはカプセル化の破壊を防ぎアンドゥを実現させます。

 19.Stateパターン

 これまで、なにか具体的なものをクラスとして表現してきましたが、このパターンでは状態そのものをクラスに表現します。クラスの切り替えによって、状態の変化を泡ラスことができます。

 20.Flyweightパターン

 メモリの使用量はほんとに悩ましい問題です。このパターンではオブジェクトを軽くすることを目的としています。出来る限りインスタンスを共有して、無駄に新しいオブジェクトの生成を行わないことで、メモリの使用量を抑えます。

 21.Proxyパターン

 処理を行うときに本人と代理人をオブジェクトとして表現します。代理人にある程度の処理を任せて、それが出来ないときには本人に切り替えて処理を行います。

 22.Commandパターン

 あるイベントが発生したときに、その出来事をインスタンスに保存します。イベントをまとめておけば、履歴としてそれを管理できますし、まとまったものを再び元に戻すのも容易なります。Commandパターンについては、次でも紹介します。

 23.Interpreterパターン

 ここでは、Java言語をInterpreter(通訳)として、ミニ言語を作成してそれをはしらせました。ただ、記憶に残るところがあまりなかったのが正直な感想です。

 

 この参考書、とても勉強になったので機会がある度に振り返っていこうと思います。コードを読んだり、書いたりしたときにパターンを見つけることが出来たら、そこは詳しく取り上げようと思います。