Я думаю, что это должно быть на File
.
Если у вас есть только один FileService (на соединение с сервером), который функционирует как Фабрика файлов, вы, вероятно, захотите, чтобы эта служба поддерживалана свидание.Затем вы могли бы использовать что-то:
FactoryServiceImpl implements FactoryService {
public File findFile(criteria) {
return new FileImpl(this);
}
}
// This should be package scope!
FileImpl implements File {
private FactoryService service;
// package scope!
FileImpl(FactoryService service) {
this.service = service;
}
public delete() {
// invalidate this object - all calls should throw exception
// Inform the service that this File should be deleted from
// the server; or if the FileImpl does that itself, that the
// FileService should update the cache of available files
service.delete(this);
}
}
EDIT
Там сейчас циклическая зависимость, которая невелика.JVM, вероятно, может обнаружить его и очистить любой материал, но вы также можете использовать WeakReference.
Выбор дизайна - неважно, идете ли вы с тонкой фабрикой и файлом фактов, или наоборот.Но они должны иметь возможность общаться, поскольку файл, который удаляется через фабрику, должен знать , что он был удален.
Некоторый код (предполагает фабрику фактов):
// This should be package scope!
FileImpl implements File {
private Weakreference<FactoryService> serviceRef;
// package scope!
FileImpl(FactoryService service) {
this.serviceRef = new WeakReference<FactoryService>(service);
}
public delete() {
// invalidate this object - all calls should throw exception
// Inform the service that this File should be deleted from
// the server; or if the FileImpl does that itself, that the
// FileService should update the cache of available files
FactoryService service = serviceRef.get();
if (service != null) {
service.delete(this);
}
}
}
В этом случае я предполагаю фабрику фактов, так как, вероятно, задействовано сетевое соединение, и разделение соединения между несколькими объектами и потоками, как правило, делает неясной ответственность за закрытие этого соединения.
Это имеетвследствие этого интерфейс FactoryService должен иметь метод close()
или dispose()
, который завершает соединение и делает недействительными все файлы (поскольку они больше не доступны).
EDIT 2
Что касается OOD, я бы, вероятно, попытался имитировать Java File API, насколько это возможно.Таким образом, объект может быть удален сам.Независимо от того, находится ли реализация в File или где-либо в FileSystem (для интерфейса и пользователей класса).