パターンは、最善の手順と良い設計を記述するための手段です。
パターンは、一般的なプログラム上の課題に柔軟な解決策を提供します。
Factoryパターンにより、実行時にオブジェクトを初期化できるようになります。
これは、オブジェクトを"製造する"ことに似ているため、
Factoryパターンと呼ばれています。
例 19-23. Factoryメソッド
<?php class Example { // ファクトリーメソッド public static function factory($type) { if (include_once 'Drivers/' . $type . '.php') { $classname = 'Driver_' . $type; return new $classname; } else { throw new Exception ('Driver not found'); } } } ?>
|
このメソドをクラス内で定義することで、実行時に
ロードされるドライバを作成できるようになります。
Exampleクラスが、データベース抽象化クラスで、
MySQL および SQLite
ドライバをロードするとすると以下のように行うことができます。
<?php // MySQLドライバをロード $mysql = Example::factory('MySQL');
// SQLiteドライバをロード $sqlite = Example::factory('SQLite'); ?>
|
|
Singletonパターンは、クラスのインスタンスが一つだけであることが
必要である場合に適用されます。
この最も一般的な例は、データベースへの接続です。
このパターンを実装することで、プログラマは
この単一のインスタンスが他の多くのオブジェクトから容易に
アクセスできるようにすることができます。
例 19-24. Singleton関数
<?php class Example { // クラスのインスタンスをゴールド private static $instance;
// private なコンストラクタ。直接オブジェクトが生成されるのを防ぐ private function __construct() { echo 'I am constructed'; }
// singleton メソッド public static function singleton() { if (!isset(self::$instance)) { $c = __CLASS__; self::$instance = new $c; }
return self::$instance; }
// とあるメソッド public function bark() { echo 'Woof!'; }
// ユーザーがインターフェースを複製するのを防ぐ public function __clone() { trigger_error('Clone is not allowed.', E_USER_ERROR); }
}
?>
|
このコードにより、Exampleクラスのインスタンスが一つ
作られ、取得されます。
<?php // コンストラクタがprivateであるため、これは失敗します $test = new Example;
// これにより、クラスの単一のインスタンスを取得します。 $test = Example::singleton(); $test->bark();
// これにより、E_USER_ERROR が発生する $test_clone = clone($test);
?>
|
|