Уничтожение созданных объектов с фабрики (проблема с висящим указателем)

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

что-то подобное (C#):

public class MyFactory {
    public MyObject CreateObject() { ... }
    public void DestroyAllObjects() { ... }
}

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

Проблема здесь - проблема с "висящим указателем". Как я могу уведомить клиентский код о том, что кэшированный объект был признан недействительным и больше не должен использоваться? Я думал о том, чтобы либо использовать обратные вызовы (con: усложняет код клиента), либо проверять при каждом вызове, что объект все еще действителен (con: усложняет код MyObject + code dup).

Я понимаю, что в идеальном мире объекты будут разрушать себя, но система требует централизованного метода отключения.

Хотелось бы услышать ваши мысли, если бы кто-то сталкивался с подобной проблемой в прошлом.

1 ответ

Если ваша фабрика может уничтожить объекты, мы можем сказать, что это владелец по умолчанию. Так почему бы не сконцентрировать больше функциональности на фабрике или на фабрике? Т.е. включить фабрику в авторитетный реестр в отношении живучести объектов.

Одна возможность: создать обертку вокруг MyObject который проверяет перед каждой операцией с реестром, является ли основной MyObject был уничтожен? Если он был уничтожен, он либо не будет работать, либо сгенерирует исключение, либо по вашему усмотрению.

Другие вопросы по тегам