Приспособленец

Типы шаблонов проектирования
Приспособленец — структурный шаблон проектирования, при котором объект, представляющий себя как уникальный экземпляр в разных местах программы, по факту не является таковым.

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

Пример
Использование паттерна приспособленец а примере хранения фамилий и имен. В большом приложении для хранения полей, где часто будут повторятся текстовые объекты (фамилии, имена, адреса и т. д.), следует использовать отдельное хранилище для ведения реестра уникальных значений поля. В конкретной записи будет храниться не текстовое значение поле а ссылка (индекс) записи значения из реестра.

Рассмотрим пример на использование подхода с классом User и хранением имени и фамилии пользователей.

Для хранения 6 полей имени-фамилии используется только 4 текстовых поля, так как имена и фамилии повторяются

from dataclasses import dataclass
from typing import ClassVar


@dataclass
class User:
    name: str

@dataclass
class User2:
    name: str
    strings: ClassVar = []
    names: ClassVar = []

    def __post_init__(self):
        def get_or_add(s):
            if s in self.strings:
                return self.strings.index(s)
            else:
                self.strings.append(s)
                return len(self.strings)-1
        self.names = [get_or_add(x) for x in self.name.split(' ')]

    def __str__(self):
        return ' '.join([self.strings[x] for x in self.names])


if __name__ == '__main__':
    u1 = User2('Александр Петров')
    u2 = User2('Владимир Конев')
    u3 = User2('Александр Конев')
    print(u1.names)
    print(u2.names)
    print(u3.names)
    print(User2.strings)
Выводы
Паттерн приспособленец определяет:
- принцип хранения данных во вне объектов
- использование ссылки или индекса на внешнее хранилище данных
- определяет идею диапазоном для однородных объектов и хранения его свойства