Les patterns "Builder" et "Factory": même combat

Cet article a été publié depuis plus de 6 mois, cela signifie que le contenu peut ne plus être d'actualité.

Aujourd'hui, j'ai envie de vous parler des patterns "Builder" et "Factory". S'il y en a un qui est bien connu des développeurs, on ne fait pas toujours la distinction entre ces deux patterns qui ont un objectif similaire: la création de nouveaux objets.

La factory (ou fabrique en français) est un patron de conception qui permet de créer un objet sans avoir à connaître la classe exacte de l'objet retourné. Ce dernier est alors construit en une seule étape. Exemple :

class DatabaseConnectionFactory
{
    private $dbParams;

    public function __construct(array $params)
    {
        $this->dbParams = $params;
    }

    public function create($type)
    {
        switch ($type) {
            case 'mysql':
                return new MysqlDatabaseConnection($this->dbParams);

            case 'pgsql':
                $conn = new PgsqlDatabaseConnection();
                $conn->setParams($this->dbParams);

                return $conn;

            default:
                throw new \InvalidArgumentException();
        }
    }
}

Le pattern builder quand à lui se focalise sur la construction d'objets plus complexes qui ne peuvent être créés en une seule étape. Il est parfois nécessaire que la création d'un objet nécessite plusieurs étapes. C'est alors que les objets de type builder sont utilisés. Exemple :

class WebserviceClientBuilder
{
    private $serviceUrl;

    public function __construct($url)
    {
        $this->serviceUrl = $url;
    }

    public function build()
    {
        $clientStrategyFactory = new clientStrategyFactory();
        $client = $clientStrategyFactory->create($this->serviceUrl);

        return new WebserviceClient($client);
    }
}

L'exemple ci-dessus est très simple, mais on voit bien que la création d'un client pour utiliser le web service nécessite la création de deux objets : le premier permettant de définir la stratégie à adopter pour accéder à ce dernier et le second est le client à proprement parlé.

Il existe également d'autres patrons de conception permettant de créer des objets, mais ces derniers étant moins utilisé (donc certains que je n'ai jamais pratiqués), je n'en parlerai pas. Je vous invite notamment à découvrir les patterns Object pool et Prototype.