Прототип - это паттерн, которые позволяет создавать новые объекты путем копирования вместо создания новых объектов.
Стоит использовать когда требуется чтобы система была независима от способа создания композиции и представления объектов, когда создаваемые объекты имеют большое число различных состояний, когда требуется избежать построения иерархий классов фабрик и когда клонирование объектов более эффективно, создание нового.
Используется в библиотеках для работы с графикой, игровых движках, ORM и в шаблонизаторах.
Плюсы: Позволяет добавлять и удалять объекты во время выполнения. Сокращает число подклассов. Позволяет динамически конфигурировать приложение. Упрощает создание сложных объектов.
Минусы: Сложно клонировать составные объекты, имеющие ссылки на другие объекты. Может потребоваться модификация существующих классов для добавления поддержки клонирования.
В отличие от Фабричного метода и Строителя, возвращает готового клона через клонирование (тавтология получается) вместо создания нового.
Пример: `import copy
class UserSettings: def init(self, background, font_size, theme): self.background = background self.font_size = font_size self.theme = theme self.history = []
def copy(self): new = UserSettings(self.background, self.font_size, self.theme) new.history = self.history.copy() return new
def deepcopy(self, memo): new = UserSettings( copy.deepcopy(self.background, memo), copy.deepcopy(self.font_size, memo), copy.deepcopy(self.theme, memo) ) new.history = copy.deepcopy(self.history, memo) return new
def str(self): return (f"Настройки: фон={self.background}, " f"размер шрифта={self.font_size}, " f"тема={self.theme}, " f"история={self.history}")
#Использованиеif name == "main": default_settings = UserSettings("white", 12, "light") default_settings.history.append("initial setup")
user1_settings = copy.deepcopy(default_settings) user1_settings.background = "blue" user1_settings.history.append("changed background")
user2_settings = copy.deepcopy(default_settings) user2_settings.theme = "dark" user2_settings.history.append("changed theme")
print("Настройки по умолчанию:", default_settings) print("Настройки пользователя 1:", user1_settings) print("Настройки пользователя 2:", user2_settings) #weekofpatterns`