Base/Knowledges/IT/Рефакторинг/Методы рефакторинга/Замена конструктора фабричной функцией (Replace Constructor with Factory Function).md
2026-02-23 19:52:05 +03:00

37 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#рефакторинг #методы_рефакторинга
![[Pasted image 20250213084721.png]]
### **Проблема**
У вас есть сложный конструктор, делающий нечто большее, чем простая установка значений полей объекта.
```typescript
leadEngineer = new Employee(document.leadEngineer, 'E');
```
### **Решение**
Создайте фабричный метод и замените им вызовы конструктора.
```typescript
leadEngineer = createEngineer(document.leadEngineer);
```
### **Причины рефакторинга**
Самая очевидная причина применения этого рефакторинга связана с [[Замена кода типа подклассами (Replace Type Code with Subclasses)|заменой кодирования типа подклассами]].
У вас есть код, в котором раньше создавался объект, куда передавалось значение кодированного типа. После применения рефакторинга появилось уже несколько подклассов, из которых нужно создавать объекты в зависимости от значения кодированного типа. Изменить оригинальный конструктор так, чтобы он возвращал объекты подклассов, невозможно, поэтому мы создаём статический фабричный метод, который будет возвращать объекты нужных классов, после чего он заменяет собой все вызовы оригинального конструктора.
Фабричные методы можно использовать и в других ситуациях, когда возможностей конструкторов оказывается недостаточно. Они важны при [[Замена значения ссылкой (Change Value to Reference)|замене значения ссылкой]]. Их можно также применять для задания различных режимов создания, выходящих за рамки числа и типов параметров.
### **Достоинства**
- Фабричный метод не обязательно возвращает объект того класса, в котором он был вызван. Зачастую это могут быть его подклассы, выбираемые в зависимости от подаваемых в метод аргументов
- Фабричный метод может иметь более удачное имя, описывающее, что и каким образом он возвращает, например, `Troops::GetCrew(myTank)`.
- Фабричный метод может вернуть уже созданный объект в отличие от конструктора, который всегда создает новый экземпляр
### **Порядок рефакторинга**
1. Создайте фабричный метод. Поместите в него вызов текущего конструктора
2. Замените все вызовы конструктора вызовами фабричного метода
3. Объявите конструктор приватным
4. Обследуйте код конструктора и попытайтесь вынести в фабричный метод тот код, который не относится к непосредственному конструированию объекта текущего класса
### **Ссылки**
- https://refactoring.guru/ru/replace-constructor-with-factory-method
- [[Мартин Фаулер - Рефакторинг кода на JavaScript]]