GoFパターン
絶版に伴い、校正前の原稿テキストを公開したものです。基本的に原稿そのままをHTML形式に変換したものですので、誤字/脱字、説明不足の箇所もあるかも知れませんがご了承ください。初出:「PHPによるデザインパターン入門」(下岡秀幸/畑勝也/道端良 著, 秀和システム, ISBN4-7980-1516-4, 2006年11月23日発売)
1995年、Erich Gamma氏、Richard Helm,氏 Ralph Johnson氏、John Vlissides氏の4名(GoF:Gang of Four;4人のギャングたち)により、ある一冊の書籍が世に送り出されました。通称「GoF本」と呼ばれる「Design Patterns : Elements of Reusable Object Oriented Software」(邦題:「オブジェクト指向における再利用のためのデザインパターン」/ソフトバンクパブリッシング/1999年)です。聞いたことのある方も多いかと思います。
この本では、23個のパターンが紹介されています。また、それぞれに名前が付けられており、「カタログ」として整理されています。また、単に「デザインパターン」という場合、この23個のパターンを指す場合もあり、非常に有名なパターンとして広く知られています。
GoF本では、23個のデザインパターンの目的を、次の3つのカテゴリに分類しています。
- オブジェクトの生成に関するパターン
- プログラムの構造に関するパターン
- オブジェクトの振る舞いに関するパターン
表にGoF本で名前を与えられた23個のパターンの名前とその目的をまとめます。
また、GoF本では、パターンを効率よく利用できるよう、利用の範囲でも分類しています。これは、それぞれのデザインパターンを、「クラス」と「オブジェクト」のどちらに適用するかを示すためです。
表は、利用範囲で分類した23個のパターンを示しています。
「クラス」に分類されるパターンは、親クラスとサブクラスの関係を利用して、対象とする問題を解決するパターンになります。当然、この関係は継承を使用することになりますので、コーディングをおこなった時点でクラスどうしの関係が決まります。このような関係を「静的」と言います。
●クラスどうしの静的な関係<?php
class SomeClass
{
:
}
/**
* この時点でクラスどうしの関係が決まる
*/
class AnotherClass extends SomeClass
{
:
}
一方、「オブジェクト」に分類されるパターンの場合、オブジェクトどうしの関係を利用して、対象とする問題を解決するパターンになります。この場合、その関係を実行時に決定することができます。つまり、オブジェクトを生成する、具体的にはnew演算子を使ってインスタンスを生成したり、アクセサメソッド(setXXXという名前のメソッド)を使ってオブジェクトを他のオブジェクトに挿入するタイミングなどでオブジェクトどうしの関係が決まります。このような関係を「動的」と言います。
●オブジェクトどうしの動的な関係(1)<?php
:
/**
* このタイミングでオブジェクトどうしの関係が決まる
*/
$object = new SomeClass();
:
●オブジェクトどうしの動的な関係(2)<?php
:
$object = new SomeClass();
$another_object = new AnotherClass();
/**
* このタイミングでオブジェクトどうしの関係が決まる
*/
$object->setObject($another_object);
:
また、表をよく見ると、Adapterパターンがクラス、オブジェクトのいずれの範囲にも分類されていることに気づくかと思います。実際に、Adapterパターンの実装方法には、静的・動的の2パターンが存在します。これについては、第3章で見ていきます。
|