Государственный шаблон проектирования с интерфейсами - PullRequest
1 голос
/ 11 октября 2019

Я читаю книгу с Design Patterns for Unity , и я узнал о "State Pattern". Любопытная вещь для меня - это то, что я впервые увидел этот шаблон, используемый с интерфейсами. Он делает все состояния, используя интерфейсы.

public class Ship : MonoBehaviour
{
    private IShipState m_CurrentState;

    private void Awake()
    {
        IShipState m_CurrentState = new NormalShipState();
        m_CurrentState.Execute(this);
    }

    public void Normalize()
    {
        m_CurrentState = new NormalShipState();
        m_CurrentState.Execute(this);
    }

    public void TriggerRedAlert()
    {
        m_CurrentState = new AlertShipState();
        m_CurrentState.Execute(this);
    }

    public void DisableShip()
    {
        m_CurrentState = new DisabledShipState();
        m_CurrentState.Execute(this);        
    }

    public void LogStatus(string status)
    {
        Debug.Log(status);
    }
}

Я не совсем понимаю, что происходит, когда переменная m_CurrentState "переинициализируется". Таким образом, мы в Awake делаем наш m_CurrentState как NormalShipState. Но когда мы запрашиваем изменение состояния этой переменной "m_CurrenState", что именно происходит? Я читал о сборке мусора и всех его этапах, а также о том, что он выпустит мертвые предметы, освобождая место для других предметов. Но что происходит с этим m_CurrentState, когда мы делаем вызов new ()?

  1. Что происходит со старой памятью? Он будет собираться сборщиком мусора?

  2. Производит новое выделение памяти каждый раз, когда я запрашиваю изменение состояния, и может вызвать переполнение памяти?

1 Ответ

0 голосов
/ 11 октября 2019

Если нет других ссылок на объект, на которые ранее ссылалась m_CurrentState, то этот объект будет собирать мусор, если он есть, то не будет.

Он такой же, как и любой другой объект, он не имеет специальных правил сборки мусора просто потому, что это интерфейс.

...