Вопрос проверяет понимание различий между порождающими паттернами Builder и Factory, их назначения и сценариев применения.
Оба паттерна относятся к порождающим, но их цели различаются. Factory (или Factory Method) предоставляет интерфейс для создания объекта, делегируя подклассам решение о том, какой класс инстанцировать. Builder же отделяет конструирование сложного объекта от его представления, позволяя одному и тому же процессу построения создавать разные представления.
Factory применяется, когда нужно создать объект одного из нескольких возможных типов, и выбор зависит от контекста. Например, создание разных видов документов (PDF, Word, HTML) через единый интерфейс. Клиент получает готовый объект без знания деталей его создания.
// Пример Factory Method на JavaScript
class DocumentFactory {
createDocument(type) {
switch(type) {
case 'pdf': return new PDFDocument();
case 'word': return new WordDocument();
default: throw new Error('Unknown type');
}
}
}
const factory = new DocumentFactory();
const doc = factory.createDocument('pdf');Builder полезен, когда объект имеет много параметров или требует сложной последовательности шагов для создания. Например, построение SQL-запроса, HTML-формы или объекта с необязательными полями. Builder позволяет накапливать настройки и в конце получить результат.
// Пример Builder на JavaScript
class QueryBuilder {
constructor() {
this.query = '';
}
select(fields) {
this.query += `SELECT ${fields} `;
return this;
}
from(table) {
this.query += `FROM ${table} `;
return this;
}
where(condition) {
this.query += `WHERE ${condition}`;
return this;
}
build() {
return this.query;
}
}
const query = new QueryBuilder()
.select('name, age')
.from('users')
.where('age > 18')
.build();Вывод: используйте Factory, когда нужно создать объект одного из семейств классов, и Builder — когда объект сложный и его конфигурация может варьироваться. Оба паттерна улучшают читаемость и поддерживаемость кода, но решают разные проблемы.