Один из шаблонов творческого дизайна — это шаблон дизайна Prototype . Несмотря на то, что Прототип является творческим паттерном, он отличается от других паттернов концепцией. Я имею в виду, что Прототип в каком-то смысле создает сам себя. Я собираюсь объяснить это ниже.
Вся магия шаблона Prototype основана на методе clone () объекта Java. Итак, давайте рассмотрим пример использования, а затем я попытаюсь выяснить, какие минусы и плюсы имеет этот шаблон.
Диаграмма классов, приведенная выше, показывает нам основной смысл паттерна. Абстрактный класс или интерфейс могут играть роль прототипа. Обратите внимание, что прототип должен расширять интерфейс Cloneable. Это потому, что конкретные реализации прототипа будут вызывать метод clone (). Конкретный класс, который реализует интерфейс (расширяет абстрактный класс), должен содержать метод, который будет возвращать свою копию с помощью операции клонирования.
В моем примере я объявил интерфейс Unicellular как прототип, а класс Amoeba — его реализацию:
1
2
3
4
5
|
public interface Unicellular extends Cloneable { public Unicellular reproduce(); } |
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
public class Amoeba implements Unicellular { public Unicellular reproduce() { Unicellular amoeba = null ; try { amoeba = (Unicellular) super .clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return amoeba; } public String toString() { return "Bla bla bla it's a new amoeba..." ; } } |
Демонстрация:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
|
... public static void main(String[] args) { Unicellular amoeba = new Amoeba(); List< Unicellular > amoebaList = new ArrayList< Unicellular >(); amoebaList.add(amoeba.reproduce()); amoebaList.add(amoeba.reproduce()); amoebaList.add(amoeba.reproduce()); for (Unicellular a : amoebaList) System.out.println(a); } ... |
Результат:
1
2
3
|
Bla bla bla it’s a new amoeba… Bla bla bla it’s a new amoeba… Bla bla bla it’s a new amoeba… |
А как насчет минусов и плюсов? На самом деле я не знаю, что сказать по этому поводу, потому что я никогда не сталкивался с такими ситуациями, когда шаблон Prototype будет применен соответствующим образом. Может быть, в некоторых случаях, когда вам не нужно явно вызывать конструктор или когда системе не нужно зависеть от способа создания объектов.