Está en la página 1de 5

PATRON DE DISEO: Prototipo.

El patrn de diseo Prototype (Prototipo), especifica la clase de objetos a crear mediante la clonacin de un prototipo que es una instancia ya creada. El patrn Prototipo se vale de una clase con este mismo nombre para presentar una interfaz que ser desarrollada luego por clases PrototipoConcreto. Motivacin: Este patrn es interesante cuando nos encontramos ante una aplicacin, por ejemplo un editor grfico, que crea a partir de modelos nuevos objetos. Estos modelos, o prototipos, son clonados y el nuevo objeto ser una copia de los mismos, por tanto cada uno de los objetos prototipo debe implementar el mtodo Clonar(). Esto es til si trabajamos en una aplicacin que crea en tiempo de ejecucin objetos concretos que tenemos inicialmente fijados, tambin cuando slo existe un nmero pequeo de combinaciones diferentes de estado para las instancias de una clase. En el caso de un editor grfico, podemos crear rectngulos, crculos, etc... estos nuevos objetos pertenecern a una jerarqua de objetos cuyas clases derivadas son particulares para la aplicacin. Ejemplo del editor grfico:

Estructura:

Participantes: Cliente: Es el encargado de solicitar la creacin de los nuevos objetos a partir de los prototipos. Prototipo Concreto: Posee una caractersticas concretas que sern reproducidas para nuevos objetos e implementa una operacin para clonarse. Prototipo: Declara una interfaz para clonarse, a travs de la que accede el cliente. Colaboraciones: El cliente solicita al prototipo que se clone. Consecuencias: Oculta las clases producto del cliente. Permite que el cliente trabaje con clases dependientes de la aplicacin sin cambios. Es posible aadir y eliminar productos en tiempo de ejecucin Especificacin de nuevos objetos mediante el cambio de sus valores. Especificacin de nuevos objetos mediante la variacin de su estructura. Reduccin del nmero de subclases. Configuracin dinmica de una aplicacin.

Desventajas: La jerarqua debe ofrecer la posibilidad de clonar un elemento y esta operacin no es, en general, sencilla de implementar, si esta se produce frecuentemente, el costo puede ser importante. Otros detalles: Clonacion profunda_vs_Clonacion superficial: Entre las diferentes caractersticas que puede tener el prototipo a la hora de implementarlo cabe destacar dos maneras de realizar la clonacin: superficial y profunda.

En la primera de ellas un cambio en un hijo del clon afecta al original, porque los hijos son los mismos, mientras que en la clonacin profunda se clonan los objetos y tambin sus hijos. Un ejemplo de ello:

Soporte en Java: En Java disponemos de la interfaz cloneable y del Object Clone() throws CloneNotSupportedException para llevar a cabo la implementacin nuestro protipo. Evolucin: Como evolucin de este patrn nos encontraremos con el conocido como Product Trader o negociador de productos que se centra en el tratamiento de los protipos cuando varios clientes trabajan sobre ellos.

Ejemplo en PHP para aadir a los que ya estn en la wikipedia: En este ejemplo tenemos una clase abstracta BookPrototype, con dos subclases concretas: PHPBookPrototype y SQLBookPrototype. Para crear un objeto usndolas llamaremos al mtodo clonar. <?php abstract class BookPrototype { protected $title; protected $topic; abstract function __clone(); function getTitle() { return $this->title; } function setTitle($titleIn) { $this->title = $titleIn; } function getTopic() { return $this->topic; } } class PHPBookPrototype extends BookPrototype { function __construct() { $this->topic = 'PHP'; } function __clone() { } } class SQLBookPrototype extends BookPrototype { function __construct() { $this->topic = 'SQL'; } function __clone() { } } writeln('BEGIN TESTING PROTOTYPE PATTERN'); writeln(''); $phpProto = new PHPBookPrototype(); $sqlProto = new SQLBookPrototype(); $book1 = clone $sqlProto; $book1->setTitle('SQL For Cats'); writeln('Book 1 topic: '.$book1->getTopic()); writeln('Book 1 title: '.$book1->getTitle()); writeln(''); $book2 = clone $phpProto; $book2->setTitle('OReilly Learning PHP 5'); writeln('Book 2 topic: '.$book2->getTopic());

writeln('Book 2 title: '.$book2->getTitle()); writeln(''); $book3 = clone $sqlProto; $book3->setTitle('OReilly Learning SQL'); writeln('Book 3 topic: '.$book3->getTopic()); writeln('Book 3 title: '.$book3->getTitle()); writeln(''); writeln('END TESTING PROTOTYPE PATTERN'); function writeln($line_in) { echo $line_in."<br/>"; } ?> BEGIN TESTING PROTOTYPE PATTERN Book 1 topic: SQL Book 1 title: SQL For Cats Book 2 topic: PHP Book 2 title: OReilly Learning PHP 5 Book 3 topic: SQL Book 3 title: OReilly Learning SQL END TESTING PROTOTYPE PATTERN

También podría gustarte