← Назад к вопросам

В чём разница между Fabric и Builder?

1.8 Middle🔥 181 комментариев
#C# и ООП#Паттерны проектирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между паттернами Fabric и Builder

В разработке игр на Unity и в программной инженерии в целом, паттерны Fabric (чаще называемый Factory или Фабрика) и Builder (Строитель) являются двумя фундаментальными подходами к созданию объектов. Они решают разные проблемы, связанные с процессом инстанцирования и конструирования, и их понимание критически важно для построения гибкой и поддерживаемой архитектуры. Вот их ключевые различия.

Основная цель и назначение

Паттерн Factory (Фабрика)

Основная цель — создание объектов без указания их точного класса. Фабрика отвечает за инстанцирование, абстрагируя процесс создания и возвращая объект, соответствующий определённому интерфейсу или базовому классу. Это полезно, когда тип создаваемого объекта определяется условиями или входными параметрами.

Паттерн Builder (Строитель)

Основная цель — конструирование сложных объектов step-by-step. Builder разделяет процесс создания объекта на отдельные шаги, позволяя создавать объекты с разными конфигурациями, используя один и тот же процесс построения. Он особенно полезен для объектов со множеством параметров (особенно опциональных) или когда порядок и состав этапов создания могут варьироваться.

Примеры в контексте Unity/C#

Пример Factory (Фабрика) для создания разных типов врагов

public interface IEnemy
{
    void Attack();
}

public class Goblin : IEnemy
{
    public void Attack() => Debug.Log("Goblin swings a club!");
}

public class Dragon : IEnemy
{
    public void Attack() => Debug.Log("Dragon breathes fire!");
}

public class EnemyFactory
{
    public IEnemy CreateEnemy(string type)
    {
        switch (type)
        {
            case "Goblin":
                return new Goblin();
            case "Dragon":
                return new Dragon();
            default:
                throw new ArgumentException("Unknown enemy type");
        }
    }
}

// Использование
var factory = new EnemyFactory();
IEnemy enemy = factory.CreateEnemy("Dragon");
enemy.Attack();

Фабрика здесь скрывает конкретные классы Goblin и Dragon, возвращая интерфейс IEnemy. Клиентский код зависит только от интерфейса.

Пример Builder (Строитель) для создания сложного объекта персонажа

public class Character
{
    public string Name { get; set; }
    public int Health { get; set; }
    public int Strength { get; set; }
    public List<string> Inventory { get; set; }
    // ... множество других свойств
}

public class CharacterBuilder
{
    private Character _character = new Character();

    public CharacterBuilder SetName(string name)
    {
        _character.Name = name;
        return this;
    }

    public CharacterBuilder SetHealth(int health)
    {
        _character.Health = health;
        return this;
    }

    public CharacterBuilder AddToInventory(string item)
    {
        _character.Inventory.Add(item);
        return this;
    }

    public Character Build()
    {
        return _character;
    }
}

// Использование (часто с Fluent Interface)
var builder = new CharacterBuilder();
Character hero = builder
    .SetName("Артур")
    .SetHealth(100)
    .AddToInventory("Меч")
    .AddToInventory("Щит")
    .Build();

Builder позволяет конструировать объект Character поэтапно, устанавливая только необходимые свойства. Это делает код создания более читаемым и позволяет легко создавать разные вариации.

Ключевые различия в таблице

КритерийFactory (Фабрика)Builder (Строитель)
Основная задачаСоздание объекта определённого типа (инстанцирование).Поэтапное конструирование сложного объекта.
Сложность объектаЧаще для объектов с простой или стандартной структурой.Для объектов со множеством компонентов или сложной внутренней структурой.
Контроль процессаСоздание обычно происходит в одном методе.Процесс разделён на несколько методов, клиент может контролировать этапы.
Возвращаемый результатВозвращает готовый для использования продукт.Возвращает полностью сконструированный продукт после вызова Build().
АбстракцияАбстрагирует тип создаваемого объекта.Абстрагирует процесс создания объекта.
Полезность в UnityДля создания пулов объектов, инстанцирования префабов разных типов, внедрения зависимостей.Для настройки сложных компонентов GameObject, сборки UI-интерфейсов, создания конфигураций данных.

Когда использовать каждый паттерн в Unity проекте?

  • Используйте Factory, когда:
    *   Вам нужно создавать различные типы `GameObject` или компоненты в зависимости от условий (например, выбор врага по его ID).
    *   Вы реализуете **Object Pool** для разных категорий объектов.
    *   Вы хотите уменьшить зависимость клиентского кода от конкретных классов префабов.
    *   Процесс создания объекта относительно прост и одношаговый.

  • Используйте Builder, когда:
    *   Вы конфигурируете сложный `GameObject` с множеством компонентов, настроек и иерархических связей (например, сборка модульного здания).
    *   У вас есть класс данных (например, `SaveGameData` или `CharacterConfig`) с множеством опциональных полей.
    *   Вы хотите сделать процесс создания объекта более читаемым и избежать "телефонных" конструкторов с 10+ параметрами.
    *   Процесс создания должен быть гибким и допускать разные комбинации шагов.

Заключение

Factory и Builder не являются взаимозаменяемыми. Fabric (Factory) — это паттерн для выбора и инстанцирования правильного типа объекта. Builder — это паттерн для поэтапного сборки и конфигурации одного сложного объекта. В больших Unity проектах они часто используются вместе: например, Factory может возвращать Builder для определённого типа объектов, который затем используется для его тонкой настройки перед финальным созданием. Понимание этой разницы позволяет выбирать правильный инструмент для решения конкретной задачи создания объектов, ведущий к более чистому, модульному и управляемому коду.

В чём разница между Fabric и Builder? | PrepBro