Паттерн Прототип - порождающий
Позволяет клонировать объекты с их подкапотной начинкой, не вдаваясь в подробности их реализации.
Tip
Допустим, у нас есть меню с блюдами, и при запросе пользователя нужно выдавать объект того или иного блюда.
При паттерне прототип (Prototype) существует класс, который имеет список разных объектов (меню блюд).
При обращении к классу создать новый объект определенного вида (спагетти), он копирует (вместо создания с нуля) и возвращает клонированный объект данного вида, который у него имеется на данный момент.
from abc import ABC, abstractmethod
import copy
class Menu:
def __init__(self):
self._menudict = {}
def add(self, name, dish_obj):
self._menudict[name] = dish_obj
def remove(self, name):
del self._menudict[name]
def create(self, name):
return self._menudict[name].clone()
class MenuItem(ABC):
def __str__(self):
return self.name
@abstractmethod
def clone(self):
pass
class Spaghetti(MenuItem):
def __init__(self):
self.name = "Спагетти"
def clone(self):
return copy.deepcopy(self)
class Hamburger(MenuItem):
def __init__(self):
self.name = "Гамбургер"
def clone(self):
return copy.deepcopy(self)
menu = Menu()
spaghetti = Spaghetti()
hamburger = Hamburger()
menu.add("spagh", spaghetti)
menu.add("hambu", hamburger)
new_spaghetti = menu.create("spagh")
print(spaghetti, hamburger, new_spaghetti)
print(spaghetti == new_spaghetti)
# output:
# Спагетти Гамбургер Спагетти
# False