Что такое шаблоны проектирования? Шаблон Factory
Last updated: 10 мая 2025 г.При проектировании того или иного программного продукта разработчик сталкивается с большим количеством проблем. И многие из этих проблем бывают ТИПИЧНЫМИ при разработке.
Так вот, чтобы разработчик сам не сидел и не выдумывал как ему решить какую-то типичную при разработке многих программных продуктов проблему, существует уже готовое решение этой проблемы, которое этот разработчик может использовать.
То есть существует шаблон, следуя которому разработчик может решить типичную проблему.
Сами подумайте, знание существующего, проверенного временем шаблона для решения типичной при построении приложения проблемы может существенно упростить разработчику жизнь. Без знания шаблонов разработчик может намудрить что-то такое, что скажется и на продуктивности, и на читабельности кода, и на другом.
Шаблон Factory
Первый паттерн, который мы рассмотрим называется Factory
(фабрика).
Factory довольно простой паттерн.
Часто в приложении может понадобиться вспомогательный объект с помощью которого можно создавать другие объекты. То есть это объект, который является фабрикой других объектов.
Важное уточнение, что фабрика создает экземпляры ОДНОТИПНЫХ классов.
В примере ниже фабрика книг производит разные книги (экземпляры этих книг).
1//Тип создаваемых объектом фабрики объектов
2//это книга. Очевидно что все реализующие
3//этот интерфейс классы будут тоже книгами
4//только уже конкретными книгами.
5interface Book {
6 void read();
7}
8
9//Реализуем этот интерфейс
10//таким образом создавая конкретную
11//книгу "Властелин колец"
12class LordOfTheRings implements Book {
13 public void read() {
14 System.out.println(
15 "Reading Lord of The Rings!");
16 }
17}
18
19//Реализуем этот интерфейс еще раз
20//таким образом создавая вторую
21//конкретную книгу "На западном фронте
22//без перемен.".
23class AllQuietOnTheWesternFront
24 implements Book {
25 public void read(){
26 System.out.println(
27 "Reading All Quiet On The "
28 + "Western Front!");
29 }
30}
31
32//Создаем класс фабрики книг.
33//Объект класса фабрики книг должен
34//уметь создавать объект любого
35//определенного выше класса книги.
36class BooksFactory {
37 //Метод объекта фабрики ниже как раз будет
38 //создавать объект конкретной книги.
39 //Как можно увидеть аргументом этому методу
40 //передается название книги объект которой
41 //хочет создать тот кто вызывает этот метод.
42 public Book createBook(String bookName) {
43 switch (bookName) {
44 //То есть как видим если аргументом методу
45 //была передана строка "Lord Of The Rings"
46 case "Lord Of The Rings":
47 //то будет создан и возвращен объект
48 //класса LordOfTheRings.
49 return new LordOfTheRings();
50 //Если аргументом методу была передана
51 //строка "All Quiet On The Western Front"
52 case "All Quiet On The Western Front":
53 //то будет создан и возвращен объект
54 //класса AllQuietOnTheWesternFront.
55 return new AllQuietOnTheWesternFront();
56 default:
57 return null;
58 }
59 }
60}
61
62//Воспользуемся созданными классами в main методе.
63public class FactoryExample {
64 public static void main(String[] args) {
65
66 //Создадим объект книги "Властелин колец"
67 //используя объект фабрики книг.
68 Book lordOfTheRings =
69 new BooksFactory()
70 .createBook("Lord Of The Rings");
71
72 //Создадим объект книги "На западном фронте
73 //без перемен" используя объект фабрики книг.
74 Book allQuietOnTheWestFr =
75 new BooksFactory()
76 .createBook("All Quiet On The "
77 + "Western Front");
78
79 //Проверим успешно ли нам создала фабрика
80 //объектов разных книг вызвав методы этих
81 //этих книг.
82 lordOfTheRings.read();
83 allQuietOnTheWestFr.read();
84 }
85}
Скомпилируем java файл и запустим программу.

Как видим, read
у созданных объектов вывел на консоль разные строки. Значит BooksFactory
умеет создавать РАЗНЫЕ ОДНОТИПНЫЕ объекты.
Когда применяется Factory?
Данный шаблон применяется по двум основным причинам:
1. Все объекты книг создаются одним методом.
Представьте себе приложение, которое содержит ранее написанные нами классы книг и класс фабрики книг, и которое также имеет пользовательский интерфейс.
Пусть этот интерфейс содержит поле для ввода названия книги и представьте, что то, что введет пользователь в это поле будет передано аргументом в метод фабрики createBook
.
Метод фабрики createBook
создаст объект той книги, которую хочет пользователь по названию, которое он ввел.
Суть в том, что тому, кто пишет программу заранее не известно, что пользователь напишет в поле для ввода в пользовательском интерфейсе, объект какой именно книги пользователь захочет создать.
То есть благодаря тому, что все объекты книг создаются одним и тем же методом, в программе создается именно тот объект, который хочет пользователь, а не программист или кто либо еще.
2. Второй важный момент, это то, что программист может добавить дополнительный функционал в класс фабрики, который может быть применен к любому создающемуся фабрикой объекту.
Дополнительные материалы
Head First Design Patterns - книга в свободном доступе
Видеоразбор Factory Pattern на примере игр
Примеры Factory Pattern в реальных проектах на GitHub
Следующие уроки
Шаблон Singleton: обеспечение единственного экземпляра
14
мин.
Шаблон DAO: работа с БД через объект
13
мин.
Шаблон Front Controller: централизованная обработка запросов
14
мин.