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

С каким паттерном лучше всего взаимодействует фабрика

2.0 Middle🔥 161 комментариев
#Паттерны проектирования

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

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

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

Взаимодействие фабрики с другими паттернами проектирования

Фабричный метод (Factory Method) и Абстрактная фабрика (Abstract Factory) отлично взаимодействуют с несколькими ключевыми паттернами, образуя мощные комбинации для создания гибких и поддерживаемых систем. Наиболее сильная и классическая связь у фабрики наблюдается с паттерном Стратегия (Strategy) и Одиночка (Singleton), но также важны комбинации с Строителем (Builder), Наблюдателем (Observer) и Декоратором (Decorator). Рассмотрим основные синергии.

1. Стратегия + Фабрика: Динамическое создание алгоритмов

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

// Стратегия: интерфейс поведения врага
public interface IAttackBehaviour
{
    void Attack();
}

// Конкретные стратегии
public class MeleeAttack : IAttackBehaviour { /*...*/ }
public class RangedAttack : IAttackBehaviour { /*...*/ }
public class MagicAttack : IAttackBehaviour { /*...*/ }

// Фабрика для создания стратегий
public class AttackBehaviourFactory
{
    public IAttackBehaviour Create(EnemyType type)
    {
        switch (type)
        {
            case EnemyType.Orc: return new MeleeAttack();
            case EnemyType.Archer: return new RangedAttack();
            case EnemyType.Mage: return new MagicAttack();
            default: return new MeleeAttack();
        }
    }
}

// Использование в классе врага
public class Enemy : MonoBehaviour
{
    private IAttackBehaviour _attackBehaviour;
    
    public void Initialize(EnemyType type)
    {
        var factory = new AttackBehaviourFactory();
        _attackBehaviour = factory.Create(type);
    }
    
    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
            _attackBehaviour?.Attack();
    }
}

2. Одиночка + Фабрика: Централизованное управление созданием

Часто фабрику делают одиночкой, чтобы иметь единую точку создания объектов во всем приложении. В Unity это особенно удобно для менеджеров и сервисов.

public class EnemyFactory : MonoBehaviour
{
    private static EnemyFactory _instance;
    
    public static EnemyFactory Instance
    {
        get
        {
            if (_instance == null)
                _instance = FindObjectOfType<EnemyFactory>();
            return _instance;
        }
    }
    
    [SerializeField] private GameObject _orcPrefab;
    [SerializeField] private GameObject _goblinPrefab;
    
    public GameObject CreateEnemy(EnemyType type, Vector3 position)
    {
        GameObject prefab = type == EnemyType.Orc ? _orcPrefab : _goblinPrefab;
        return Instantiate(prefab, position, Quaternion.identity);
    }
}

3. Строитель + Фабрика: Создание сложных объектов

Когда объекты имеют сложный процесс создания с множеством опциональных параметров, фабрика может использовать строитель.

// Строитель для персонажа
public class CharacterBuilder
{
    private Character _character = new Character();
    
    public CharacterBuilder WithWeapon(string weapon) { /*...*/ return this; }
    public CharacterBuilder WithArmor(string armor) { /*...*/ return this; }
    public CharacterBuilder WithSkills(List<string> skills) { /*...*/ return this; }
    
    public Character Build() => _character;
}

// Фабрика использует строитель
public class CharacterFactory
{
    public Character CreateWarrior()
    {
        return new CharacterBuilder()
            .WithWeapon("Sword")
            .WithArmor("Plate Armor")
            .WithSkills(new List<string> {"Slash", "Block"})
            .Build();
    }
}

4. Наблюдатель + Фабрика: Уведомление о создании объектов

Фабрика может выступать в роли субъекта, уведомляя наблюдателей о создании новых объектов. Это полезно для систем статистики, логирования или пулинга.

public class EnemyFactory : MonoBehaviour
{
    public static event Action<GameObject> OnEnemyCreated;
    
    public GameObject CreateEnemy(GameObject prefab, Vector3 position)
    {
        GameObject enemy = Instantiate(prefab, position, Quaternion.identity);
        OnEnemyCreated?.Invoke(enemy); // Уведомляем всех подписчиков
        return enemy;
    }
}

Почему именно Стратегия?

В контексте Unity-разработки комбинация Фабрика + Стратегия особенно ценна:

  • Разделение ответственности: Фабрика занимается созданием, стратегия — поведением
  • Гибкость контента: Легко добавлять новые типы врагов, оружия или способностей
  • Упрощение тестирования: Стратегии легко тестировать изолированно
  • Динамическая смена поведения: Во время выполнения можно создавать и подставлять новые стратегии

Вывод: Хотя фабрика эффективно взаимодействует со многими паттернами, наиболее сильный симбиоз возникает с паттерном Стратегия. Эта комбинация позволяет создавать системы, где фабрика поставляет конкретные реализации абстрактного поведения, обеспечивая высокую гибкость, расширяемость и соблюдение принципа единственной ответственности. В Unity-разработке это часто встречается в системах AI, управлении оружием, обработке состояний персонажей и других динамических аспектах игровой логики.