Статическая фабрика.md
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
parent
af09d9f6e0
commit
8ce575f586
78
dev/java/Статическая фабрика в Java.md
Normal file
78
dev/java/Статическая фабрика в Java.md
Normal file
@ -0,0 +1,78 @@
|
||||
---
|
||||
aliases:
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-10-06
|
||||
zero-link:
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
[[../other/Статическая фабрика|Статическая фабрика]] в Java — это метод, который возвращает экземпляры класса, но вместо создания объектов через конструктор, используется статический метод. Такой подход дает разработчику гибкость в процессе создания объектов, возможность кэширования и возвращения уже созданных экземпляров, а также улучшает читаемость кода за счет осмысленных имен методов, таких как `of()` или `valueOf()`.
|
||||
|
||||
Статическая фабрика часто используется для реализации паттернов, таких как Singleton, а также для создания объектов, требующих дополнительной логики при инициализации.
|
||||
|
||||
Рассмотрим простой пример создания объекта с помощью статической фабрики:
|
||||
|
||||
```java
|
||||
public class Foo {
|
||||
private int value;
|
||||
|
||||
// Приватный конструктор
|
||||
private Foo(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
// Статический фабричный метод
|
||||
public static Foo of(int value) {
|
||||
return new Foo(value);
|
||||
}
|
||||
|
||||
// Другой статический метод
|
||||
public static Foo doubleCreate(int value) {
|
||||
return new Foo(value * value);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Здесь конструктор класса `Foo` является приватным, и доступ к нему осуществляется через два статических метода: `of()` для простого создания объекта и `doubleCreate()`, который создает объект с модифицированным значением.
|
||||
|
||||
Теперь рассмотрим пример с кэшированием, чтобы избежать создания новых объектов при одинаковых параметрах:
|
||||
|
||||
```java
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class Foo {
|
||||
private static final Map<Integer, Foo> cache = new HashMap<>();
|
||||
private int value;
|
||||
|
||||
private Foo(int value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
// Статический фабричный метод с кэшированием
|
||||
public static Foo of(int value) {
|
||||
if (!cache.containsKey(value)) {
|
||||
cache.put(value, new Foo(value));
|
||||
}
|
||||
return cache.get(value);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
В этом примере используется кэширование: если объект с определенным значением уже был создан, статическая фабрика возвращает его из кэша, а если нет — создает новый и сохраняет его для дальнейшего использования.
|
||||
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Java разработка|00 Java разработка]]
|
||||
**Родитель**:: [[../other/Статическая фабрика|Статическая фабрика]]
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-10-06]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
||||
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
|
42
dev/other/Статическая фабрика.md
Normal file
42
dev/other/Статическая фабрика.md
Normal file
@ -0,0 +1,42 @@
|
||||
---
|
||||
aliases: []
|
||||
tags:
|
||||
- maturity/🌱
|
||||
date: 2024-10-06
|
||||
zero-link:
|
||||
parents:
|
||||
linked:
|
||||
---
|
||||
Статическая фабрика — это метод, который создает и возвращает экземпляры класса, но вместо использования конструктора объект создается через статический метод. Основное отличие от конструктора заключается в том, что статическая фабрика предоставляет более гибкие возможности для создания объектов, включая возможность выбора имени метода, возврат кэшированных или предварительно созданных экземпляров и более точный контроль над процессом инициализации.
|
||||
|
||||
Статическая фабрика работает через методы, которые вызываются на уровне класса (без необходимости создавать его экземпляр) и возвращают новый или уже существующий объект. Примером могут служить методы с осмысленными именами, такими как `of()`, `from()`, или `getInstance()`, которые четко указывают на логику создания. Такой подход позволяет скрывать реализацию, контролировать процесс создания объектов и даже возвращать кэшированные экземпляры.
|
||||
|
||||
Преимущества статической фабрики:
|
||||
- **Гибкость в именовании методов** — вместо ограничений конструктора можно создавать методы с наглядными названиями, которые лучше описывают процесс создания.
|
||||
- **Контроль над процессом создания** — статическая фабрика может возвращать не только новые экземпляры, но и повторно использовать уже существующие, например, из пула объектов.
|
||||
- Обеспечение [[../architecture/Инкапсуляция|инкапсуляции]] — можно скрыть детали реализации и даже сам конструктор, предоставляя более чистый интерфейс для пользователей класса.
|
||||
|
||||
Однако у статической фабрики есть и недостатки:
|
||||
- **Отсутствие наследования** — в отличие от обычных конструкторов, статические методы нельзя наследовать.
|
||||
- **Ограниченность в динамическом создании объектов** — не всегда легко использовать в контексте рефлексии или динамической инициализации объектов.
|
||||
|
||||
Реализации:
|
||||
- [[../java/Статическая фабрика в Java|Статическая фабрика в Java]]
|
||||
|
||||
|
||||
***
|
||||
## Мета информация
|
||||
**Область**:: [[../../meta/zero/00 Разработка|00 Разработка]]
|
||||
**Родитель**::
|
||||
**Источник**::
|
||||
**Создана**:: [[2024-10-06]]
|
||||
**Автор**::
|
||||
### Дополнительные материалы
|
||||
-
|
||||
|
||||
### Дочерние заметки
|
||||
<!-- QueryToSerialize: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
<!-- SerializedQuery: LIST FROM [[]] WHERE contains(Родитель, this.file.link) or contains(parents, this.file.link) -->
|
||||
- [[Статическая фабрика в Java]]
|
||||
<!-- SerializedQuery END -->
|
||||
|
Loading…
Reference in New Issue
Block a user