interface ExceptionFactory {
   public function getException($result=NULL, $message=NULL);
}

class PostgresExceptionFactory implements ExceptionFactory {
   public function getException($result=NULL, $message=NULL) {
      return new PostgresException ($result, $message);
   }
}

class PostgresException extends Exception {

   function __construct($result=NULL, $message=NULL) {
      $code = 0;
      if ($message == NULL) {
         if ($result <> NULL) {
            $message = pg_result_error ($result);
            $code = pg_result_status($result);
         } else {
            $message = pg_last_error();
         }
      }
      parent::__construct ($message, $code);
   }
}

class MySqlExceptionFactory implements ExceptionFactory {
   public function getException($result=NULL, $message=NULL) {

      return new MySqlException ($result, $message);
   }
}

class MySqlException extends Exception {
   function __construct($result=NULL, $message=NULL) {
      if ($message == NULL) {
         $message = mysql_error();
      }
      $code = 0;
      if ($result <> NULL) {
         $code = mysql_errno($resource);
      }
      parent::__construct ($message, $code);
   }
}

/*
 * przykad uycia w pseudokodzie
 */

// tworzy odpowiedni obiekt Factory
$factory = new PostgresExceptionFactory();
// getException zwraca PostgresException
if ( ... wystpuje bd ... ) {
   throw $factory->getException();
}