Статьи

Введение в дизайн шаблонов: шаблон прототипа

Сегодня мы рассмотрим шаблон проектирования Prototype.  Укажите типы объектов, создаваемых с использованием прототипа, и создайте новые объекты, скопировав этот прототип. — гоф

Тип

Создание объекта

Решение

Шаблон Prototype создает новый объект путем клонирования существующего объекта. Клиент, использующий объект-прототип, не должен знать, с каким объектом он имеет дело, если конкретный прототип расширяет или реализует интерфейс / класс прототипа. Конкретный объект-прототип отвечает за клонирование самого себя и возврат клонированного объекта.

Шаблон позволяет клиенту создать тип объекта, требуемый во время выполнения, выбрав соответствующий прототип. Классы-прототипы создаются клиентом в общем, и клиент не знает точного типа конкретного прототипа. Новые конкретные прототипы могут быть добавлены во время выполнения, если они соответствуют абстрактному прототипу.

Состав

Пример кода Java

Пример 1:

Скачать пример 1

Ниже приведен пример шаблона прототипа. Прототип объекта является объектом Animal . Животные прототип содержит два конкретных подклассы прототипа под названием Sheep и куры . Класс AnimalCreator содержит ссылки на два конкретных прототипа. Во время инициализации класса AnimalCreator два конкретных прототипа, Sheep и Chicken , создаются и сохраняются как два конкретных прототипа, являющихся членами класса AnimalCreator . Класс AnimalCreator содержит retrieveAnimal метод, который клонирует прототип Animal в зависимости от переданного ему параметра.

Animal.java
Класс Animal является абстрактным прототипом двух конкретных прототипов в примере. Клиент вызывает методы для двух разных конкретных прототипов через тип Animal, чтобы гарантировать, что клиент не знает тип конкретных прототипов.

Наиболее важно, что прототип Animal определяет метод клонирования, чтобы помочь двум подтипам или конкретным прототипам клонировать себя.

Код:

public Animal clone() {	 

Animal clonedAnimal = null;
try {
clonedAnimal = (Animal) super.clone();
clonedAnimal.setDescription(description);
clonedAnimal.setNumberOfLegs(numberOfLegs);
clonedAnimal.setName(name);
} catch (CloneNotSupportedException e) {
e.printStackTrace();
} // catch
return clonedAnimal;
} // method clone

Sheep.java
Объект Sheep — это конкретный прототип, расширяющий прототип Animal . У прототипа Sheep есть метод clone для клонирования себя для создания нового объекта.

Код:

public class Sheep extends Animal {

Chicken.java
Объект Chicken — это конкретный прототип, который расширяет прототип Animal . У прототипа Chicken есть метод clone для клонирования себя для создания нового объекта.

Код:

public class Chicken extends Animal {

AnimalCreator.java
Класс AnimalCreator используется для создания и управления объектами-прототипами. Класс AnimalCreator содержит два конкретных прототипа, которые инициализируются во время инициализации класса. Класс AnimalCreator формирует часть шаблона «Prototype», возвращая клонированный объект (Animal) клиенту без знания клиентом типа прототипа.

Код:

public Animal retrieveAnimal(String kindOfAnimal) {	
if ("Chicken".equals(kindOfAnimal)) {
return (Animal) chicken.clone();
} else if ("Sheep".equals(kindOfAnimal)) {
return (Animal) sheep.clone();
} // if

return null;
} // method retrieveAnimal

AnimalClient.java
Класс AnimalClient использует класс AnimalCreator для создания конкретных прототипов типа Animal . Класс AnimalClient не знает тип конкретных прототипов, но ссылается на них через прототип Animal .

Код:

AnimalCreator animalCreator = new AnimalCreator();	 
Animal[] animalFarm = new Animal[8];
animalFarm[0] = animalCreator.retrieveAnimal("Chicken");
animalFarm[1] = animalCreator.retrieveAnimal("Chicken");
animalFarm[2] = animalCreator.retrieveAnimal("Chicken");
animalFarm[3] = animalCreator.retrieveAnimal("Chicken");
animalFarm[4] = animalCreator.retrieveAnimal("Sheep");
animalFarm[5] = animalCreator.retrieveAnimal("Sheep");
animalFarm[6] = animalCreator.retrieveAnimal("Sheep");
animalFarm[7] = animalCreator.retrieveAnimal("Sheep");
for (int i= 0; i<=7; i++) {
System.out.println(animalFarm[i].helloAnimal());
} // for

Консоль
Ниже приведен вывод AnimalClient, вызывающий различные конкретные объекты-прототипы.

Cluck cluck World. I am Chicken1. I have 2 legs.
Cluck cluck World. I am Chicken2. I have 2 legs.
Cluck cluck World. I am Chicken3. I have 2 legs.
Cluck cluck World. I am Chicken4. I have 2 legs.
Meeeeeee World. I am Sheep1. I have 4 legs.
Meeeeeee World. I am Sheep2. I have 4 legs.
Meeeeeee World. I am Sheep3. I have 4 legs.
Meeeeeee World. I am Sheep4. I have 4 legs.

Пример диаграммы классов

Схема последовательности

Диаграмма последовательности «Яника Ингельбрехта» с Trace Modeler

Рекомендации

  • Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес. Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения. Аддисон Уэсли, 1995