Статья
Шаблон проектирования "Прототип"

Шаблон проектирования "Прототип"

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