Уничтожение созданных объектов с фабрики (проблема с висящим указателем)
Предположим, у меня есть фабричный класс с методом создания, который создает объекты, а также имеет опцию отключения, которая делает недействительными все созданные объекты (поэтому они больше не могут использоваться).
что-то подобное (C#):
public class MyFactory {
public MyObject CreateObject() { ... }
public void DestroyAllObjects() { ... }
}
Клиенты этого кода создают объекты, кэшируют ссылку и используют ее. Объекты могут быть либо уничтожены вручную, либо будут уничтожены путем вызова DestroyAllObjects в фабричном классе.
Проблема здесь - проблема с "висящим указателем". Как я могу уведомить клиентский код о том, что кэшированный объект был признан недействительным и больше не должен использоваться? Я думал о том, чтобы либо использовать обратные вызовы (con: усложняет код клиента), либо проверять при каждом вызове, что объект все еще действителен (con: усложняет код MyObject + code dup).
Я понимаю, что в идеальном мире объекты будут разрушать себя, но система требует централизованного метода отключения.
Хотелось бы услышать ваши мысли, если бы кто-то сталкивался с подобной проблемой в прошлом.
1 ответ
Если ваша фабрика может уничтожить объекты, мы можем сказать, что это владелец по умолчанию. Так почему бы не сконцентрировать больше функциональности на фабрике или на фабрике? Т.е. включить фабрику в авторитетный реестр в отношении живучести объектов.
Одна возможность: создать обертку вокруг MyObject
который проверяет перед каждой операцией с реестром, является ли основной MyObject
был уничтожен? Если он был уничтожен, он либо не будет работать, либо сгенерирует исключение, либо по вашему усмотрению.