PHP: el patrón de diseño Builder o Constructor, cómo y cuando usarlo

2022-02-04 - Categorías: General / PHP / Principios y patrones

Este patrón de diseño del software es de los del tipo creacionales. Los Builder o Constructores se usa para preparar la construcción de objetos complejos, o para preparar la construcción de baterías de clases complejas.

Estas clases complejas pueden ser de todo tipo. Simplemente se trata de una forma de dividir un problema grande o complejo en trozos más pequeños. Vamos al grano..

Al grano, un caso de uso para usar el patrón Builder

Por ejemplo, supongamos que queremos hacer un programa para elaborar mapas. Mapas de varios tipos, con lo que elaborar estos mapas puede ser complejo. También podría ser para preparar pizas, casas, diagnósticos, líneas de conexion, etcétera.. cualquier cosa compleja o grande.

Se podría quedar en algo tal que así:

Volviendo al caso de uso, elaborar mapas, supongamos que queremos elaborar mapas de costa, sierra y selva. Se le puede dar una vuelta de tuerca al esquema:

Show me the code, el código fuente en PHP

Una clase para contener los mapas:

<?php

class Map
{
    /**
     * Here goes more code..
     */
}

Esto podría ser la interfaz que define los contratos de construcción:

<?php

interface IMapBuilder
{
    public function getResultMap(): Map;
    public function buildLand(Map $newMap);
    public function buildWater(Map $newMap);
    public function buildMountains(Map $newMap);
    public function buildTrees(Map $newMap);
    public function buildAnimals(Map $newMap);
    public function buildSky(Map $newMap);
}

Y unas implementaciones:

<?php

class CoastMapBuilder implements IMapBuilder
{
    public function getResultMap(): Map
    {
        $newMap = new Map();

        $this->buildLand($newMap);
        $this->buildWater($newMap);
        $this->buildMountains($newMap);
        $this->buildTrees($newMap);
        $this->buildAnimals($newMap);
        $this->buildSky($newMap);

        return $newMap;
    }

    public function buildLand(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildWater(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildMountains(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildTrees(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildAnimals(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildSky(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }
}
<?php

class MountainsMapBuilder implements IMapBuilder
{
    public function getResultMap(): Map
    {
        $newMap = new Map();

        $this->buildLand($newMap);
        $this->buildWater($newMap);
        $this->buildMountains($newMap);
        $this->buildTrees($newMap);
        $this->buildAnimals($newMap);
        $this->buildSky($newMap);

        return $newMap;
    }

    public function buildLand(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildWater(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildMountains(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildTrees(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildAnimals(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildSky(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }
}
<?php

class JungleMapBuilder implements IMapBuilder
{
    public function getResultMap(): Map
    {
        $newMap = new Map();

        $this->buildLand($newMap);
        $this->buildWater($newMap);
        $this->buildMountains($newMap);
        $this->buildTrees($newMap);
        $this->buildAnimals($newMap);
        $this->buildSky($newMap);

        return $newMap;
    }

    public function buildLand(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildWater(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildMountains(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildTrees(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildAnimals(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }

    public function buildSky(Map $newMap)
    {
        /*
         * Code to build some parts of the new map..
         */
    }
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

 

© 2022 JnjSite.com - MIT license

Sitio hecho con WordPress, diseño y programación del tema por Jnj.