Skip to content

Latest commit

 

History

History
74 lines (49 loc) · 2.06 KB

File metadata and controls

74 lines (49 loc) · 2.06 KB

Паттерн Прототип

Паттерн Прототип - порождающий

Позволяет клонировать объекты с их подкапотной начинкой, не вдаваясь в подробности их реализации.

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