IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Introducció

El patró de disseny de Factoria en object-oriented programming (OOP) és un objecte que crea altres objectes. L'objectiu és:

  • creates objects without exposing the instantiation logic to the client.
  • refers to the newly created object through a common interface

El Factory Method pattern defineix una interfície en temps d'execució (runtime) per a crear un objecte. Se l'anomena factoria per que és capaç de crear varios tipus d'objectesense necessariament saber quin tipus d'objectes crea ni com crear-los.

I per què?:

Resources

Exemple explicant els beneficis

Primera raó Keep things DRY, vegeu la següent classe:

class A{
    public $classb;
    public $classc;
    public function __construct($classb, $classc)
    {
         $this->classb = $classb;
         $this->classc = $classc;
    }
  }

Cada cop que hem de crear un objecte de la classe hem d'executar el codi:

$obj = new ClassA(new ClassB, new Class C);

Sembla doncs una bona raó crear una factoria:

class Factory{
    public function build()
    {
        $classc = $this->buildC();
        $classb = $this->buildB();
        return $this->buildA($classb, $classc);

    }
public function buildB()
    {
        return new ClassB;
    }

    public function buildC()
    {
        return new ClassC;
    }

I per crear l'objecte només cal:

$factory = new Factory;
$obj     = $factory->build();

Imagineu com el exemple encara és més clar si els objectes B i C també depenguessin d'altres objectes...

Resources

Exemples de factories

Una implementació senzilla:

class Factory {
  public static function create($name, $config)
  {
    if (class_exists($name))
    {
      return new $name($config);
    }
  }
}

Una implementació més completa:

<?php
class ProductFactory
{
    public static function build($type) {
        // assumes the use of an autoloader
        $product = "Product_" . $type;
        if (class_exists($product)) {
            return new $product();
        }
        else {
            throw new Exception("Invalid product type given.");
        }
    } 
}

Vegeu també

Enllaços externs