Статьи

Шаблоны креационного дизайна: шаблон прототипа

Образец прототипа используется для создания копии объекта. Этот шаблон может быть действительно полезным, особенно когда создание объекта с нуля является дорогостоящим.
По сравнению с шаблонами построителя , фабрики и абстрактной фабрики он не создает объект с нуля, а клонирует / воссоздает его. По сравнению с одноэлементным шаблоном он создает несколько копий экземпляра, в то время как одноэлементный должен гарантировать, что будет существовать только один.

Представьте себе сценарий объекта, который для создания требует очень ресурсоемкого метода. Это может быть запрос к базе данных со многими объединениями или даже результат федеративного поиска.
Мы хотим, чтобы эти данные обрабатывались различными алгоритмами, используя один поток на алгоритм. Каждый поток должен иметь свою собственную копию исходного экземпляра, поскольку использование одного и того же объекта приведет к противоречивым результатам.

Таким образом, у нас есть интерфейс для представления результатов поиска.

01
02
03
04
05
06
07
08
09
10
package com.gkatzioura.design.creational.prototype;
 
public interface SearchResult {
 
    SearchResult clone();
 
    int totalEntries();
 
    String getPage(int page);
}

И у нас есть реализация SearchResult FederatedSearchResult.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package com.gkatzioura.design.creational.prototype;
 
import java.util.ArrayList;
import java.util.List;
 
public class FederatedSearchResult implements SearchResult {
 
    private List<String> pages = new ArrayList<String>();
 
    public FederatedSearchResult(List<String> pages) {
        this.pages = pages;
    }
 
    @Override
    public SearchResult clone() {
 
        final List<String> resultCopies = new ArrayList<String>();
        pages.forEach(p->resultCopies.add(p));
        FederatedSearchResult federatedSearchResult = new FederatedSearchResult(resultCopies);
        return federatedSearchResult;
    }
 
    @Override
    public int totalEntries() {
        return pages.size();
    }
 
    @Override
    public String getPage(int page) {
        return pages.get(page);
    }
}

Таким образом, мы можем использовать метод clone и создавать столько копий, сколько нам нужно для создания очень дорогого объекта.

Вы можете найти исходный код на github .

Также я собрал шпаргалку, содержащую сводку шаблонов креационного дизайна. Зарегистрируйтесь в ссылке, чтобы получить его.

Опубликовано на Java Code Geeks с разрешения Эммануила Гкациоураса, партнера нашей программы JCG. Смотрите оригинальную статью здесь: Шаблоны креационного дизайна: Шаблон прототипа

Мнения, высказанные участниками Java Code Geeks, являются их собственными.