Pattern Factory, singleton et Mock

Rechercher

Pattern Factory, singleton et Mock

Par Vini  -  1 reponse  -  Le 01/02/2009 14:50  -  Editer  - 

Bonjour à tous!

je m'exerce à la POO et je souhaite mieux comprendre le pattern factory.je voudrais pouvoir utilisé un Mock pour faire mes tests !

pour mon exemple je choisi la BDDj'ai comme classabstract Db, oracle, Mysql, et mon mockj'ai bien compris le singleton mais je ne s'est pas comment le joindre avec le factory pour choisir ma base de donnée !un peu de code

abstract class Db {    private $host;   private $username;   private $password;   abstract protected function connection();   public function seConnecter()  {    $this->connection();  }   }
class Mysql extends Db {    public function connection()   {     echo 'I\'m connected to MYSQL<br />';   }   }  class Oracle extends Db {     public function connection()   {     echo 'I\'m connected to ORACLE<br />';   }  } // la j'utilise le polymorphisme // que j'apprends en même temps  $oracle = new Oracle(); $mysql  = new Mysql(); $oracle->seConnecter();$mysql->seConnecter();

ce que je cherche à faire c'est d'avoir un accès unique à ma base de donnée donc singleton qui retourne une instance et je voudrais utilisé le factory pour créer la connection en fonction de la base et donc utilsé un mock pour faire des test sans base de donnée !

bien sur habituellement j'utilse PDO mais c'est pour faire un peu d'objet et amélioré mes techniques de conceptions !

Voilà j'aurais donc besoin d'un petit coup de pouce svp !

 

Réponses apportées à cette discussion

Par Emacs  -  Le 08/02/2009 11:51  -  Haut de page  - 

Tu peux t'en sortir très simplement en spécifiant quel adaptateur tu veux utiliser dans la méthode de factory :

<?php $mysql_con  = DbFactory::getInstance('MySQL');$oracle_con = DbFactory::getInstance('Oracle');

Le mieux même, serait de donner en argument un tableau de paramètres PDO (DSN, host, port, user, pwd...). Grâce à ce tableau de paramètres, ta méthode getInstance() sera capable de deviner quel adapteur elle doit instancier et stocker dans la référence singleton. Bien sûr, tu rends ce tableau de paramètres facultatif pour ne pas avoir à le redonner à chaque fois que tu souhaites récupérer la connexion au serveur de base de données via le Singleton.

Ce qui donne par exemple :

<?php class DbFactory{  protected static $single_connection = null;   static public function getInstance($params = array())  {    if (!is_null(self::$single_connection))    {      return self::$single_connection;    }     if (!isset($params['adapter']))    {      throw new Exception('You must define an adapter (MySQL, Oracle...)');    }     $adapter = 'Db'. ucfirst(strtolower($params['adapter'])) .'Connection';    if (!class_exists($adapter))    {      throw new Exception(sprintf('The given adapter "%s" (%s) is not installed or does not exist', $params['adapter'], $adapter));    }     self::$single_connection = new $adapter($params);     return self::$single_connection;  }} class DbMySQLConnection extends AbstractDbConnection{ } class DbOracleConnection extends AbstractDbConnection{ }

Et enfin dans ton fichier de configuration et dans tes classes de modèle, tu fais appel à la factory :

<?php $params = array(  'adapter' => 'mysql',  'host'    => 'localhost',  'port'    => 3306  'user'    => 'root',  'pwd'     => 's3cR3t'); $dbConnection = DbFactory::getInstance($params); // $dbConnection contient maintenant une connection sur la base MySQL // Dans une classe de modèle, tu fais : class UserDaoTable{  public function findAll()  {    $con = DbFactory::getInstance();    // ...  }}

Voilà c'est une piste de réflexion que tu peux suivre :)

++

Hugo.

 

Ajouter une réponse à la discussion

Seuls les membres connectés sont autorisés à poster dans les forums !

Identifiez-vous
Join |  ID/MDP? |