Прототип (Prototype) – это порождающий паттерн проектирования, который используется для создания новых объектов путем копирования существующих объектов, называемых прототипами. Паттерн Прототип позволяет создавать объекты, которые могут иметь начальное состояние, и при этом избегает прямого связывания классов между собой.
Основные участники паттерна Прототип:
- Прототип (Prototype): Это абстрактный класс или интерфейс, который определяет метод
clone()
. Этот метод позволяет создавать копии объектов прототипа. - Конкретные прототипы (Concrete Prototypes): Это классы, которые реализуют интерфейс прототипа и предоставляют конкретную реализацию метода
clone()
. Каждый конкретный прототип может иметь собственное начальное состояние. - Клиент (Client): Это клиентский код, который использует прототипы для создания новых объектов. Клиент может запрашивать у прототипа копии объектов с нужным состоянием.
Пример реализации паттерна Прототип на Python:
python
from copy import deepcopy # Абстрактный класс прототипа class Prototype: def clone(self): pass # Конкретные прототипы class ConcretePrototype1(Prototype): def __init__(self, value): self.value = value def clone(self): return deepcopy(self) class ConcretePrototype2(Prototype): def __init__(self, name): self.name = name def clone(self): return deepcopy(self) # Клиентский код prototype1 = ConcretePrototype1(10) copy1 = prototype1.clone() print(copy1.value) # Вывод: 10 prototype2 = ConcretePrototype2("John") copy2 = prototype2.clone() print(copy2.name) # Вывод: John
В этом примере есть два конкретных прототипа (ConcretePrototype1
и ConcretePrototype2
), каждый из которых реализует метод clone()
. Клиентский код создает объекты прототипов и создает копии, используя метод clone()
. Каждая копия является независимой копией начального состояния прототипа.
Паттерн Прототип полезен в ситуациях, когда создание объектов путем копирования более эффективно или удобно, чем создание объектов с нуля. Это также может быть полезно, если объекты имеют сложное начальное состояние, которое требуется сохранить в копиях.