1: Primer patrón de diseño - FranzBurneo/Patrones-de-dise-o GitHub Wiki
Prototype pertenece al grupo de los patrones de diseño de creación, este patrón permite copiar objetos existentes sin hacer que su código dependa de sus clases.
La aplicación "hard wires" la clase de objeto a crear en cada expresión "new".
En la vida real, los prototipos se utilizan para realizar varias pruebas antes de comenzar la producción en masa de un producto. Sin embargo, en este caso, los prototipos no participan en ninguna producción real, sino que juegan un papel pasivo.
El Factory conoce cómo encontrar el prototipo correcto y cada producto sabe cómo generar nuevas instancias de sí mismo
El patrón Prototype especifica el tipo de objetos que se crearán utilizando una instancia prototípica. Los prototipos de nuevos productos a menudo se construyen antes de la producción completa, pero en este ejemplo, el prototipo es pasivo y no participa en la copia de sí mismo. La división mitótica de una célula, que resulta en dos células idénticas, es un ejemplo de un prototipo que juega un papel activo en copiarse a sí mismo y, por lo tanto, demuestra el patrón de Prototipo. Cuando una célula se divide, resultan dos células de genotipo idéntico. En otras palabras, la célula se clona a sí misma.
Dado que los prototipos industriales realmente no se copian a sí mismos, una analogía mucho más cercana al patrón es el proceso de división celular mitótica. Después de la división mitótica, se forma un par de células idénticas. La celda original actúa como un prototipo y tiene un papel activo en la creación de la copia.
Cuando inicia una aplicación, comprueba el tipo de sistema operativo actual. Se usa esta información para crear un objeto de fábrica a partir de una clase que coincide con el sistema operativo. El resto del código usa esta fábrica para crear elementos de IU. Esto evita que se cree elementos incorrectos. En este enfoque, el código del cliente no depende de clases en concreto y elementos de interfaz de usuario siempre que funcione con estos objetos a través de sus interfaces abstractas. Como resultado, no es necesario modificar el código del cliente cada vez que agrega una nueva variación de los elementos de la interfaz de usuario a su aplicación. Solo tiene que crear una nueva clase de fábrica que produzca de usuario a su aplicación. Solo se crea una nueva clase fábrica que produzca estos elementos y modificar ligeramente el código de inicialización para que se seleccione la clase cuando sea apropiado.
En el patrón Prototipo creamos un stándar para cada clase y clonamos ese objeto para crear nuevas instancias
En este ejemplo encontramos una clase BookPrototype abstracta, con dos subclases específicas o concretas, PHPBookPrototype y SQLBookPrototype. Para crear un objeto usando PHPBookPrototype o SQLBookPrototype llamamos al método clon.
<?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
https://refactoring.guru/design-patterns/prototype https://sourcemaking.com/design_patterns/prototype