Memorias de un desarrollador

Patron de diseño Abstract Factory

Abstract Factory

El objetivo es facilitar una interfaz para crear "familias" de objetos relacionados o dependientes sin que sea necesario especificar su clase.

Veamos mejor un ejemplo, supongamos que quiero definir una clase que genere coches.

<?php

abstract class AbstractCarFactory { abstract function makeCar(); abstract function makeVan(); }

La fabricación de coches tiene sus particularidades, por ejemplo en Europa los coches suelen ser más grandes, de mayor calidad, y más caros que los coches Asiaticos.

<?php

class EuropeanCarFactory extends
AbstractCarFactory{ abstract function makeCar(){
// ..
} abstract function makeVan(){
// ..
} }


class AsianCarFactory extends AbstractCarFactory{ abstract function makeCar(){
// ..
}; abstract function
makeVan(){
// ..
}; }

Ahora voy a definir cuales son las clases abstractas de los productos generados por estas factorias.

<?php

abstract class AbstractCar { abstract function getModelName();
abstract function getPrice(); }


abstract class AbstractVan { abstract function getModelName();
abstract function getPrice(); }

Ahora tendré que definir cuales serán las clases Car y Van para Europa y para Asia.

 

<?php

class EuropeanCar extends
AbstractCar{ function getModelName(){
return 'Renault Megane';
};
function getPrice(){
return 10000;
};
}


class EuropeanVan extends AbstractVan{ function getModelName(){
return 'Renault Kangoo';
};

function getPrice(){
return 12000;
};
}



class AsianCar extends
AbstractCar{ function getModelName(){
return 'Renault Megane';
};
function getPrice(){
return 10000;
};
}


class AsianVan extends AbstractVan{ function getModelName(){
return 'Renault Kangoo';
};

function getPrice(){
return 12000;
};
}