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;
    }
}

/*конкретный прототип для книги о 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/>";
  }

?>