/*обобщение прототипа*/
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;
}
}
/*конкретный прототип для книги о PHP*/
class PHPBookPrototype extends BookPrototype {
function __construct() {
$this->topic = 'PHP';
}
function __clone() { // клонирующий метод
}
}
/*конкретный прототип для книги о SQL*/
class SQLBookPrototype extends BookPrototype {
function __construct() {
$this->topic = 'SQL';
}
function __clone() { // клонирующий метод
}
}
writeln('BEGIN TESTING PROTOTYPE PATTERN');
writeln('');
$phpProto = new PHPBookPrototype();
$sqlProto = new SQLBookPrototype();
/*клонируем объект книги о SQL*/
$book1 = clone $sqlProto;
$book1->setTitle('SQL For Cats');
writeln('Book 1 topic: '.$book1->getTopic()); // используем полученный объект
writeln('Book 1 title: '.$book1->getTitle());
writeln('');
/*клонируем объект книги о PHP*/
$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/>";
}
?>