Los patrones de Singleton y del Registro fueron muy simples y fáciles de entender para mí, pero el patrón de Factory ha sido algo que aún no he podido hacer que mi cerebro interprete al 100%. Creo que puedo entenderlo ahora. He escrito un código de muestra a continuación, por favor revíselo y dígame si este es el uso correcto del patrón de fábrica. Muestra está en PHP ...¿Es así como funciona el patrón de fábrica?
<?php
/**
* Factory.class.php
*/
class Factory {
public static $_database;
public static $_cache;
public static $_session;
// Build our User object with all it's dependencies
public static function makeUserObject()
{
$user = new User();
$user->setDatabaseObject(self::$_database);
$user->setCacheObject(self::$_cache);
$user->setSessionObject(self::$_session);
return $user;
}
// other objects will be here someday......
}
/**
* User.class.php
*/
class User
{
public function __construct() { }
// inject Database Object
public function setDatabaseObject($databaseConnectionObject)
{
$this->_databaseObject = $databaseConnectionObject;
}
// inject Cache Object
public function setCacheObject($cacheObject)
{
$this->_cacheObject = $cacheObject;
}
// inject Session Object
public function setSessionObject($sessionObject)
{
$this->_sessionObject = $sessionObject;
}
// other methods here for User object...........
}
/**
* index.php Main page that puts it all together
* assume that classes are autoloaded into this page already
*/
// Set our Database + Cache + Session objects into the Factory Object
Factory::$_database = new Databse();
Factory::$_cache = new Cache();
Factory::$_session = new Session();
// Create our User object
// The factory class will build the User object and inject all
// it's dependencies for us =)
$user = Factory::makeUserObject();
?>
Así que, básicamente, la base de datos, caché, y los objetos de sesión se crean (no se muestra aquí), entonces se añaden al objeto de fábrica, que la puede construir un método en la clase de fábrica para cada objeto que necesitará cualquiera de estas 3 dependencias y también puedo establecer cuáles obtienen. Esto también hace que las clases individuales todavía puedan ser algo portátiles ya que puedo inyectar allí dependencias directamente si quisiera sin el objeto de fábrica. Suena bien? Si esto es correcto, esto suena realmente útil
ACTUALIZACIÓN # 1
Esto se basa de esto aquí un post que leí aquí http://www.potstuck.com/2009/01/08/php-dependency-injection/ se refieren a ella como una "fábrica", he estado usando un Registro y mucha gente sigue diciéndome que investigue una "fábrica" y todo lo que leí al respecto simplemente no hizo clic en mi cabeza hasta que leí este artículo, pero parece que no es una "fábrica".
ACTUALIZACIÓN # 2
De wikipedia http://en.wikipedia.org/wiki/Factory_object En la programación informática orientada a objetos, un objeto de fábrica es un objeto para la creación de otros objetos. Es una abstracción de un constructor y se puede usar para implementar varios esquemas de asignación, como el patrón singleton. Un objeto de fábrica generalmente tiene un método para cada tipo de objeto que es capaz de crear. Estos métodos aceptan opcionalmente parámetros que definen cómo se crea el objeto y luego devuelven el objeto creado. Los objetos de fábrica se usan en situaciones en las que agarrar un objeto de un tipo particular es un proceso más complejo que simplemente crear un objeto nuevo. El objeto de fábrica puede decidir crear la clase del objeto (si corresponde) dinámicamente, devolverlo desde un grupo de objetos, realizar una configuración compleja en el objeto u otras cosas.
así que quizás es un "objeto de fábrica" de una manera después de todo ...
¿Puede proporcionar una fuente que describe este patrón 'de fábrica'? Sé de patrones llamados 'Abstract Factory' y 'Factory Method', pero no solo 'Factory'. –
@Gordon wow eso es un montón de patrones! Así que supongo que esto no es realmente una fábrica, y pensé que finalmente estaba en algo bueno aquí – JasonDavis
@Gordon: Sí, esos son los patrones de creación del libro GoF :) No hay patrón 'Factory' allí ... –