パターン

パターンは、最善の手順と良い設計を記述するための手段です。 パターンは、一般的なプログラム上の課題に柔軟な解決策を提供します。

Factory

Factory パターンにより、実行時にオブジェクトを初期化できるようになります。 オブジェクトを"製造する"ことに似ているため、これは Factory パターンと呼ばれています。 パラメータ化された Factory が、生成するクラス名を引数として受け取ります。

例 19-24. パラメータ化された Factory メソッド

<?php
class Example
{
    
// パラメータ化された Factory メソッド
    
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

Singleton パターンは、クラスのインスタンスが一つだけであることが 必要である場合に適用されます。 この最も一般的な例は、データベースへの接続です。 このパターンを実装することで、プログラマは この単一のインスタンスが他の多くのオブジェクトから容易に アクセスできるようにすることができます。

例 19-25. 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);

?>