Представьте, что вы хотите экспортировать определенный документ в файл (в некотором формате ... допустим, XML).Конструктор против метода против фабрики
Для этого у меня есть класс XmlExporter, и вопрос в том, что ... какой лучший подход к передаче документа и файла этому классу?
Вариант 1: Экспортер не имеет гражданства, поэтому, если я хочу экспортировать другой документ или в другой файл, я просто изменяю параметр. Неудобство в том, что я должен передать файл (или, вернее, OutputStream) в каждом отдельном методе (который в случае сложного документа может быть довольно много)
class XmlExporter {
public function export(Document document, File file) {
this.writeHeader(document.header, file);
this.writeSomeOtherStuff(document.somethingElse, file);
// and more ...
}
private function writeHeader(DocumentHeader header, File file) {
writeName(header.name, file); // passing file over and over again
}
}
Вариант 2: Оба источника и цели хранится внутри пример. Если бы я хотел изменить файл, мне пришлось бы создать новый объект, но теперь мне не нужно беспокоиться о передаче всех необходимых данных.
class XmlExporter {
private final Document document;
private final File file;
public XmlExporter(Document document, File file) {
this.document = document;
this.file = file;
}
public function export() {
this.writeHeader(this.document.header);
}
private function writeHeader(DocumentHeader header) {
this.writeName(header.name);
}
private function writeName(String name) {
// ...
}
}
Вариант 3: Сочетание обоих
class DocumentExporter {
public static function exportToXml(Document document, File file) {
XmlExporter exporter = new XmlExporter(document, file);
exporter.export();
}
// the rest same as Option 2, probably with private constructor
}
В основном второй выбор делает больше смысла для меня с точки зрения написания класса, так как я не нужно передать целевой файл/поток вокруг; однако с точки зрения его фактического использования я чувствую, что первый выбор имеет смысл. Что делать, если я хочу экспортировать его в стандартный вывод вместо файла или экспортировать несколько документов?
Я бы лично пойти со вторым, потому что мне это в основном аналогично тому, как файлы в настоящее время обрабатываются с помощью шаблона декоратора, но я Wouldn» t представить это как ответ. Мне кажется, что выбор между этими 3 в значительной степени зависит от того, что является подходящим в то время –
Что касается использования свободной нотации, новый XmlExporter(). Document (d) .file (f) .export(); Если вы хотите записать несколько файлов, метод file() может полагаться на коллекцию. – TeTeT