「C#とJavaによるデザインパターンへのお誘い」

C MAGAZINE連載

結城浩

デザインパターンに関する連載記事のサポートページです。 結城浩のパターン関連書籍もご覧ください。

目次

はじめに

こんにちは、結城浩です。 ここは、 月刊誌『C MAGAZINE』 の連載記事 「C#とJavaによるデザインパターンへのお誘い」 のサポートページです。

この連載では、 毎月、簡単なプログラムを使って 具体的にパターンを紹介していきたいと思います。 GoFのパターンにこだわらず、いろんなものを紹介する予定です。

サンプルプログラムは 『Java言語で学ぶデザインパターン入門』で書いたようなシンプルなものを、 「Java」と「C#」の2つのプログラミング言語で記述します。

同じ機能を持つプログラムをJavaとC#で並べて記述することで、 パターンを学ぶだけではなくJavaとC#の違いも学べると期待しています。

もし機会がありましたら、ごらんいただければ感謝です。

Enjoy Patterns!

連載各回の主な内容

Factory Methodパターン(2002年12月号)

連載第1回は、 GoFのFactory Methodパターンについて解説します。

Factory Methodパターンは、 生成されるインスタンスがハードコーディングされるのを防ぐためのパターンです。 そのために「インスタンスを生成する工場」という役目を持つクラスを導入します。 スーパークラスではインスタンスを生成する抽象メソッドだけを宣言し、 サブクラスではそのメソッドをオーバーライドしてインスタンス生成のためのメソッドを具体的に用意します。 すなわち、具体的なインスタンスの生成はサブクラスに任せることになります。

Template Methodパターン(2003年1月号)

連載第2回は、 GoFのTemplate Methodパターンについて解説します。 JavaとC#のスレッドを使ったサンプルプログラムや、 C#のデリゲートについても触れます。

複数のクラスが共通の振る舞いをする、というのはよくあることです。 せっかく共通の振る舞いがあることがわかっているのに、 独立にコーディングをしてしまうと、再利用性は下がってしまいます。 かといって、1つのクラスに全部を押し込んでしまっては、 共通化できない処理をどうしたらよいか困ってしまいます。

Template Methodパターンは、 継承とメソッドのオーバーライドを用いて このような問題に対処します。

共通の振る舞いの部分をスーパークラスのメソッドでコーディングします。 このメソッドのことを テンプレートメソッド といいます。 テンプレートメソッドの中では、スーパークラスで宣言した抽象メソッドを用いて コーディングします。 抽象メソッドはメソッドの本体がありませんから、 具体的な処理の内容まではスーパークラスでは規定していないことになります。 スーパークラスでは、抽象メソッドを用いて処理の骨組みを規定しているのです。

処理の具体的な肉付けを行うのはサブクラスの責任です。 サブクラスでは、スーパークラスで宣言されている抽象メソッドをオーバーライドします。 このようにすれば、処理の骨組みはスーパークラスで共通化され、 しかも具体的な肉付けはサブクラスで拡張することができることになります。 これは非常に小さなフレームワークと呼ぶこともできるでしょう。 Template MethodパターンはGoFによるパターンです。

Generation Gapパターン(2003年2月号)

連載第3回は、 Generation Gapパターンを紹介します。

プログラムを作るとき、 通常は、プログラマがエディタでソースコードを書きます。 しかし、場合によってはプログラマが手でソースを書くのではなく、 ツールを使ってソースを自動生成するということもあります。 よく見かけるのは、 GUIアプリケーションの画面をデザインするツールですね。

ソースを自動的に生成するツールは、 プログラマが手で作業する量を減らしてくれますが、 自動生成したソースに人間が手を入れてしまうと、再度生成するのが困難になる という欠点もアリアンス。

Generation Gapパターンでは、 継承を使ってこの問題を解決します。 Generation Gapパターンでは、 ツールが生成するソース(クラス)に対してプログラマは直接手を入れず、 「ツールが生成したクラスのサブクラスだけをいじる」ようにします。 こうすると、ツールがソースを再度生成しても、 プログラマの修正が上書きされることはありません。

Generation GapパターンはGoFの一人、ブリシデスによるパターンです。

Null Objectパターン(2003年3月号)

連載第4回は、 Null Objectパターンを紹介します。

Null Objectパターンは、 「何もしない」という処理を行うNull Objectというオブジェクトを使って nullのチェックを省略できるというパターンです。

Null ObjectはBobby Woolfによるパターンです。

Thread-Specific Storageパターン(2003年4月号)

連載第5回は、 Thread-Specific Storageパターンを紹介します。

Thread-Specific Storageは、 スレッドに固有(Thread-Specific)な領域を、 スレッドを管理(bookkeep)しているオブジェクトの外に作ることで、 マルチスレッド対応を行うパターンです。

情報をThread-Internalに確保する方法と、 Thread-Externalに確保する方法を比較し、 さらに.NET Frameworkの[ThreadStatic]アトリビュートを紹介します。

Producer-Consumerパターン(2003年5月号)

連載第6回は、 Producer-Consumerパターンを紹介します。

Producer-Consumerという考え方は、昔から知られているものです。 実際、マルチタスク、マルチプロセス、あるいはマルチスレッドに関する書物には 必ずといっていいほど登場します。

生産者のスレッドが、 消費者のスレッドへデータを渡したい。 そのときに、 たとえ両者の処理速度がずれていても安全に渡せるようにするのが、 今回紹介するProducer-Consumerパターンです。

Single-Active-Instance Singletonパターン(2003年6月号)

連載第7回は、 Single-Active-Instance Singletonパターンを紹介します。

いわゆるGoFのデザインパターン23個のうち、 もっとも単純な(単純そうに見える)パターンはSingletonです。 Singletonパターンは、 あるクラスのインスタンスが1つしかないということを保証するものです。

今月紹介する Single-Active-Instance Singletonパターンは、 Singletonパターンのバリエーションの1つで、 これは、複数インスタンスのうち、 アクティブになっているインスタンスが1つだけというパターンです。

いつものようにJavaとC#を使って小さなサンプルプログラムを作り、 Single-Active-Instance Singletonパターンを理解します。 そしてその後、「インスタンスが1つ」ということの意味について さまざまな角度から考えをめぐらせてみましょう。

Multi-Phase Startupパターン(2003年7月号)

連載第8回は、 Multi-Phase Startupパターンを紹介します。

互いに依存関係のあるオブジェクト同士を起動するのはやっかいなものです。 今回紹介する「Multi-Phase Startupパターン」は、 これは、オブジェクトを一気に起動するのではなく、 相互に矛盾が発生しないように多数の段階(多段階)に分けて 起動していこうというパターンです。

Multi-Phase Startupパターンは、 平鍋健児さんによるパターンです。

Mock Objectパターン(2003年8月号)

連載第9回は、 Mock Objectパターンを紹介します。

Mock Objectパターンは、 設定が複雑なオブジェクトの代わりに「はりぼて」の役割をする 擬似オブジェクトを作って テストを容易にするというパターンです。

Model-View-Controllerパターン(2003年9月号)

連載第10回は、 Model-View-Controllerパターンを紹介します。

Model-View-Controllerは、 ユーザインタフェースとシステムの機能を分離するというパターンです。 これは1980年代から現在まで、 形を変化させつつもずっと使われている歴史的なパターンです。 各モジュールの再利用性を高め、またデータと表示の一貫性を保つ効果があります。

Fork/Joinパターン(2003年10月号)

連載第11回は、 Fork/Joinパターンを紹介します。

Fork/Joinパターンは、大きな問題を小さな問題に分割し、 その一つ一つの小さな問題をスレッドを使って並行して解くというものです。 これによって、たくさんの小さな問題の中に解くのが難しい問題があっても、 全体のスループットを下げずに問題解決を行うことができます。 いわば、マルチスレッド版の分割統治というわけです。

Essenceパターン(2003年11月号)

連載第12回は、 Essenceパターンを紹介します。

オブジェクトには初期化時に設定する必要がある属性(フィールド)と、 必ずしも設定が必要ではない属性があります。 Essenceパターンでは「Essence役」を導入して、 設定が必須な属性をきちんと取り扱うというものです。

なお、この記事はAndy Carlsonの論文の内容を参考にしています。 "Essence Pattern" by Andy Carlson (PLoP98)

参考文献と関連Webページ

本連載で紹介したWebページへのリンクです。

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

更新履歴

結城浩のパターン関連書籍紹介

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

*

『Java言語で学ぶデザインパターン入門』では、 デザインパターンの原典であるGoF本で紹介されている23個のデザインパターンを、 Javaのサンプルプログラムを通してやさしく解説しています。 「GoF本を読む前に、GoF本を読むために」ご一読をお勧めいたします。

書籍『Java言語で学ぶデザインパターン入門 マルチスレッド編』

『Java言語で学ぶデザインパターン入門 マルチスレッド編』では、パターンを通してマルチスレッドプログラミングをやさしく解説します。 自分でスレッドを活用したプログラミングを行う人はもちろんのこと、 たとえ自分で独自のスレッドを作ることがない人でも、 既存のフレームワークを利用するためには、 マルチスレッドを理解しておくことがとても重要です。 Javaのスレッドの基本から書き起こし、 最終章ではマルチスレッドプログラミングのパターン・ランゲージを展開します。 楽しみつつお読みください。

豊かな人生のための四つの法則