パターンは、最善の手順と良い設計を記述するための手段です。
  パターンは、一般的なプログラム上の課題に柔軟な解決策を提供します。
 
   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 パターンは、クラスのインスタンスが一つだけであることが
   必要である場合に適用されます。
   この最も一般的な例は、データベースへの接続です。
   このパターンを実装することで、プログラマは
   この単一のインスタンスが他の多くのオブジェクトから容易に
   アクセスできるようにすることができます。
  
例 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);
  ?>
 |  
  |