【初心者】GoFのデザインパターンとは?オブジェクト指向の考え方

プログラミングに携わっている人なら、デザインパターンについて触れたことがあるのではないでしょうか。デザインパターンの概念はGoFが最初に提唱してから、開発の現場にとって欠かせないものとなっています。今回はデザインパターンについて具体例も交えながらその使い方やメリットなどを紹介していきます。

デザインパターンとは?初心者向け


デザインパターンとは、プログラミングにおける、よくある問題に対する設計の定石やお手本のことです。有名なデザインパターンとして「オブジェクト指向における再利用のためのデザインパターン」という本で紹介された23個のパターンがあります。その他にもエンジニアや学者によって様々なデザインパターンが提案されています。

C言語やJavaを用いたものが主力

デザインパターンはオブジェクト指向の考え方と関連しています。デザインパターン自体は特定の言語での使用を目的にしたのものではないですが、オブジェクト指向に基づいているため、C++やC#、Javaでの利用例が豊富です。

PythonやRubyなど、オブジェクト指向でプログラミングできる言語であればどの言語でもデザインパターンを適用できますが、言語仕様の違いなどにより、かえって無駄になる場合もあるのでうまく使い分ける必要があります。

初心者ほどGoFが必要

ある程度プログラミングに慣れてきた初心者にとってGoFのデザインパターンを学ぶことは有益です。自分でプログラムの設計を考えるときの指針にもなり、設計力向上につながります。またオブジェクト指向における代表的なデザインパターンなので、パターン名で大体の内容が把握でき、他のエンジニアとのスムーズなやり取りに役立ちます。

デザインパターンは再利用性が高い

デザインパターンのメリット

プログラミングする上でよく現れる問題に対して適切な設計を利用できます。デザインパターンはこれまでの開発のノウハウや優れた設計原則が盛り込まれているので、パターンを利用することで無駄がなくスマートなプログラミングができるようになります。GoFパターンなどは有名なので、説明しなくてもパターン名だけでどんな設計にしたいのか共有できることも大きなメリットと言えるでしょう。

うまく活用すると柔軟な設計ができる

デザインパターンはオブジェクト指向の優れた設計事例ですので、参考にすることでオブジェクト指向のメリットを最大限に利用できます。実装したい内容に合わせてうまくパターンを活用することで、変更・修正がしやすく、可読性が高いプログラムを設計することができます。

オブジェクトを整理してくれる材料


デザインパターンには様々な種類があります。具体例として、有名なGoFパターンの一つであるMediatorパターンについて見ていきましょう。

Mediatorパターンを使う

Mediatorは英語で「仲介者、仲裁人」という意味です。複数のオブジェクト間の「仲介者」として機能し、各オブジェクトの関係を単純化したい時に利用します。間にMediatorを挟むことでオブジェクト同志の依存関係を弱くすることができるので、一方のオブジェクトに変更があったときに他のオブジェクトへの影響を少なくできます。

Mediatorパターンサンプル

ターン制RPGの戦闘を例に考えてみましょう。戦闘においては、自分の攻撃力や相手の防御力などお互いの情報をもとにダメージを与えたりします。また、攻撃対象がすでに死んでいたり無敵状態だったりする場合、当然攻撃はできないでしょう。このような戦闘を進めるにあたり、1対1であれば良いですが複数のキャラを扱う場合には色々な不都合が生じてしまいます。

そこで全体の戦闘管理を行うMediator抽象クラスと各キャラクターの情報を保持するColleague抽象クラスに分けて、それぞれをConcreteMediator、ConcreteColleagueとして実装します。戦闘管理クラスが相手の状態を判定したりダメージ計算などを行うことで、構造が分かりやすく実装が楽になります。以下は戦闘管理と戦闘キャラの簡単なサンプルコードになります。

ConcreteMediator(戦闘管理クラス)

 
import java.util.*;
public class ConcreteMediator extends Mediator {
private Map colleagues = new HashMap();
public void addColleague(Colleague colleague) {
colleagues.put(colleague.getName(), colleague);
}
public void attack(Colleague attacker, Colleague target) {
・・・・
/* 互いの情報をもとにダメージ計算・攻撃する処理 */
・・・・
}
}

ConcreteColleague(戦闘キャラクタークラス)

 import java.util.*;
public class ConcreteColleague extends Colleague {
private Mediator mediator = new ConcreteMediator();
private String name = “戦士”;
private Colleague enemy = null;
public String getName() {
return name;
}
public void setEnemy(Colleague colleague) {
this.enemy = colleague;
}
public void action() {
mediator.attack(this, enemy);
}
}

GoFデザインパターンとは?

23のデザインパターンがある

GoFデザインパターンとは、Gang of Four(ギャング・オブ・フォー)と呼ばれる四人組が提唱した、オブジェクト指向においてよく使える設計パターンのことを指します。このデザインパターンは全部で23種類ありますが、大きく3つに分類することができ、それぞれ「オブジェクトの生成に関するパターン」「プログラムの構造に関するパターン」「オブジェクトの振る舞いに関するパターン」と呼ばれています。

分類とパターン名

GoFデザインパターンは大きく3つに分類することができます。まず一つが「生成に関するパターン」の5つです。次に「構造に関するパターン」と呼ばれる7つのパターン、最後が「振る舞いに関するパターン」の11種類です。

Iteratorパターンは特に有名で様々な場面で用いられます。他にもFacade、SingletonやStrategy、TemplateMethodなどは基本的な設計パターンとしてよく使われており、初心者でも参考にすることでより良い設計のヒントになるでしょう。

デザインパターンおすすめの著者

ジョン・ブリシディース

ジョン・ブリシディースはGoFデザインパターンで有名な、「オブジェクト指向における再利用のためのデザインパターン」を書いたGoFの一人で、ソフトウェア科学者です。その他にもデザインパターン関連の本を出しており、GoFデザインパターンの実践的な使い方や著者が独自紹介しているパターンもあります。

エーリヒ・ガンマ

ジョン・ブリシディースと同じくGoFの一人として知られており、スイスのソフトウェア技術者です。Javaの統合開発環境として有名なEclipseのJava Development Toolsの設計リーダーであり、Eclipseプラグインに関する本も出しています。エーリヒ・ガンマもいくつか技術書を著しており、デザインパターンの本をはじめ、オブジェクト指向に関するものが多く出版されています。

まとめ

デザインパターンはオブジェクト指向の優れた設計パターンとしてGoFにより提唱され、現在では様々なパターンが多くの人によって考案されています。有名なデザインパターンがいくつかあり、それらを参考にすることで誰でもスマートな開発が行えるようになります。たくさん種類があるので必要に応じて、最適なデザインパターンを利用しましょう。

関連記事

ページ上部へ戻る