Мне кажется, что вопрос неясен.
Мы говорим об Итераторе или Фабрике?
Для меня Iterator работает с уже существующей коллекцией вещей и позволяет вызывающей стороне работать с каждой вещью по очереди.
Когда вы говорите «Выполняет», вы имеете в виду, что позволяет клиенту работать с одним файлом из существующего набора файлов, или вы имеете в виду, что вы выполняете итерацию некоторых данных и намереваетесь сохранить эти данные в файлах, которые вы генерируете , Если мы генерируем, то у нас есть Файловая фабрика.
Я предполагаю, что вы собираетесь обрабатывать некоторые файлы в файловой системе. Я думаю, что ваш итератор похож на каталог, он может дать вам следующий файл, о котором он знает. Поэтому я создаю «Driectory», передавая достаточно данных, чтобы позволить ей знать, какие файлы вы имеете в виду (это может быть просто путь к ОС, может быть какое-то выражение «find», список ссылок, подобных ftp и т. Д.) И ожидайте, что это даст мне следующий Файл, когда я буду повторяться.
---- обновлено после уточнения вопроса
Я думаю, что ключевой вопрос здесь - когда нужно открывать отдельные файлы. Сам итератор будет разумно возвращать объект File, соответствующий дескриптору открытого файла, после чего вызывающая программа может просто работать с файлом. Но обычно, если итератор работает с списком предварительно открытых файлов или списком ссылок на файлы, файлы открываются как итератор next ().
Я думаю, что мы должны сделать последнее, потому что есть открытый доступ к открытому файлу, поэтому мы должны открывать файлы только тогда, когда они нам нужны.
Это приводит к еще одному моменту: кто закрывает файл? Мы не можем позволить себе держать их всех открытыми. Возможно, итератор должен закрыть каждый файл при вызове next (). Это означает, что сам итератор нуждается в методе close (), чтобы привести в порядок текущий открытый файл. В качестве альтернативы нам необходимо четко документировать, что закрытие является обязанностью клиента.