パターン

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

Factory

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

例 19-25. パラメータ化された 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-26. 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 ;

?>