Шаблон проектирования "Прототип"
12 июня 2020Относится к порождающим шаблонам.
Помогает избежать затрат на создание объектов стандартным способом, а вместо этого создаёт прототип и затем клонирует его.
Плюсы:
- меньше повторяющегося кода инициализации объектов.
- ускоряет создание объектов.
Минусы:
- сложно клонировать составные объекты, имеющие ссылки на другие объекты
Пример на PHP
Создадим прототип книги детективного жанра:
abstract class Book
{
protected string $title;
protected string $category;
abstract public function __clone();
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): void
{
$this->title = $title;
}
}
class DetectiveBookPrototype extends Book
{
protected string $category = 'DetectiveBook';
public function __clone()
{
// ...
}
}
Использование:
$prototype = new DetectiveBookPrototype();
for ($i = 0; $i < 100; $i++) {
$book = clone $prototype;
$book->setTitle('Detective Book № ' . $i);
}
Пример на Go
package main
import "strconv"
type Book struct {
title string
category string
}
func (p *Book) SetTitle(title string) {
p.title = title
}
func (p *Book) Clone() Book {
return Book{title: p.title, category: p.category}
}
func main() {
detectiveBook := Book{title: "Detective book", category: "Detective"}
for i := 1; i < 100; i++ {
book := detectiveBook.Clone()
book.SetTitle("Detective book " + strconv.Itoa(i))
}
}
Источники:
http://designpatternsphp.readthedocs.io/ru/latest/Creational/Prototype/README.html