Christophe Meneses - Développeur
  • Liste des articles
  • Contact
  • Linkedin
  • Github
  • Flux RSS
Tous les articles PHP / Design Pattern Exemple d'utilisation de la Fabrique (Factory)
PHP Design Pattern

Exemple d'utilisation de la Fabrique (Factory)

Publié le 03/10/2016.

Vous trouverez dans cet article un exemple d'utilisation du patron de conception Fabrique (Factory) en PHP.

Définition

Ce patron de conception permet de mettre en place une classe qui va se charger d'instancier les classes nécessaires au fonctionnement de votre application. Cette classe permet au code client de se libérer de toute responsabilité (implémentation, configuration et instanciation).

Ce patron de conception peut être intéressant quand vous devez instancier des objets qui implémentent la même interface ou la même classe abstraite mais qui s'utilisent dans des contextes différents (par exemple une classe pour PostgreSQL, une autre pour MySQL). Il est également utile si on veut centraliser un code qui à la responsabilité de la création d'un objet.

Exemple

Dans notre application, selon le contexte, on veut soit utiliser une base PostgreSQL, soit une base MySQL. On va utiliser la Fabrique pour éviter de devoir réécrire le code si on change de base de données. On commence par l'interface. Une méthode pour se connecter, une deuxième pour envoyer une requête :

interface DatabaseInterface
{
    public function connect($params);
    public function query($query);
}

Ensuite, nos 2 classes qui vont implémenter cette interface. Pour PostgreSQL :

class DBPgsql implements DatabaseInterface
{
    public function connect($params)
    {
        // Implémentation spécifique
    }

    public function query($query)
    {
        // Implémentation spécifique
    }
}

Pour MySQL :

class DBMysql implements DatabaseInterface
{
    public function connect($params)
    {
        // Implémentation spécifique
    }

    public function query($query)
    {
        // Implémentation spécifique
    }
}

Il nous reste à créer la classe Fabrique. Elle comporte une méthode create() qui en fonction du type indiqué, va instancier la bonne classe :

class DatabaseFactory
{
    public static function create($type)
    {
        switch ($type) {
            case 'pgsql':
                $db = new DBPgsql(/* on passe en argument les infos de connexion */);
            break;
            case 'mysql':
                $db = new DBMysql(/* on passe en argument les infos de connexion */);
            default:
                throw new Exception('Unknown database');
        }

        return $db;
    }
}

On peut maintenant utiliser cette classe dans le code de l'application :

$db = DatabaseFactory:create('pgsql');

Si un jour, on veut passer sur MySQL, on a juste à modifier une ligne :

$db = DatabaseFactory:create('mysql');

Si on veut ajouter un nouveau type de base de données, il suffit d'implémenter l'interface dans une nouvelle classe et de modifier légèrement la classe Fabrique.

Début de l'article

Tous les articles PHP / Design Pattern Exemple d'utilisation de la Fabrique (Factory)

Liste des articles par catégorie

  1. Tous 124
  2. Apache2
  3. APC1
  4. Assetic2
  5. Bash2
  6. CentOS9
  7. Composer6
  8. CSS1
  9. Debian1
  10. Deployer1
  11. Design Pattern11
  12. Docker6
  13. Doctrine14
  14. Elasticsearch3
  15. Git6
  16. Google Charts1
  17. Hardware1
  18. Hébergement1
  19. JavaScript1
  20. jQuery4
  21. Kibana2
  22. Logstash1
  23. Machine Learning1
  24. MariaDB2
  25. Memcached2
  26. MySQL3
  27. Nginx2
  28. Panther3
  29. PHP59
  30. PHP_CodeSniffer1
  31. PHP-FPM2
  32. PhpMyAdmin1
  33. PhpStorm3
  34. PHPUnit6
  35. PostgreSQL2
  36. RabbitMQ2
  37. SQL1
  38. SVN4
  39. Sybase ASE1
  40. Symfony56
  41. Twig3
  42. Ubuntu14
  43. Vue.js2
  44. Vuex1
  45. Webpack Encore1
  46. Xdebug5

Derniers articles publiés

PHP
Différence entre les mots clés self et static dans le langage PHP

Symfony / Docker / Nginx
Migrer un projet Symfony du protocole HTTP 1.1 au protocole HTTP 2

Vue.js
Utiliser un filtre Vue.js directement dans le JavaScript

PHP / Symfony
Supprimer les messages de dépréciation de type : The "sensio_framework_extra.routing.loader.annot_*" service is deprecated since version 5.2

Symfony / RabbitMQ
Exemple d'utilisation du composant Messenger pour envoyer des emails en asynchrone avec RabbitMQ

PHP Symfony MariaDB HTML5 CSS3 JavaScript Bootstrap

© 2014 - 2019 réalisé par Christophe MENESES