Здравствуйте, сегодня мы разберем очень полезный паттерн проектирования – фабрика.
Возьмем наш код из статьи про паттерн декоратор. Допустим у нас есть класс, в котором мы храним характеристики игрока.
Это обычный класс данных с 4-мя параметрами. Класс игрока имеет метод, который правильно посчитает параметры, в зависимости от расы персонажа.
Допустим, что существует окно, где показаны начальные характеристики персонажа. И у нас уже получается дублирование кода, что не есть хорошо. Но обычно таких мест бывает больше двух, а теперь представьте, что нужно будет добавить в игру еще одну расу, для этого придется переписывать код в каждом месте. Решением обычно является вынесение создания нового объекта в отдельный класс, например, InitialStateProvider. Это единственное место, которое может вернуть характеристики персонажа, во всех остальных местах нужно будет только вызвать соответствующий метод. Тем самым мы полностью инкапсулировали метод создания объекта в зависимости от условий.
Получается, что создание объекта не всегда сводится к вызову оператора new или Instantiate. Иногда намного лучше создавать объект неявно, под занавесом общего интерфейса, чтобы решить проблему сильного связывания. Паттерн фабрика как раз для этого, он может порождать от одного объекта до целого семейства объектов, позволяя клиентскому коду не волноваться об их различиях.