Топ-100Что такое шаблоны проектирования? Шаблон Factory - CodOrbits
LogoCodOrbits

Раздел: Шаблоны проектирования

Раздел о популярных паттернах проектирования в Java: Singleton, Factory, MVC и других архитектурных решениях.

Все разделы
Иконка Шаблоны проектирования

Что такое шаблоны проектирования? Шаблон 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 - книга в свободном доступе

Additional Material Icon
Divider

Видеоразбор Factory Pattern на примере игр

Additional Material Icon
Divider

Примеры Factory Pattern в реальных проектах на GitHub

Additional Material Icon

Следующие уроки

Шаблон Singleton: обеспечение единственного экземпляра

14
мин.

Similar Articles Icon
Divider

Шаблон DAO: работа с БД через объект

13
мин.

Similar Articles Icon
Divider

Шаблон Front Controller: централизованная обработка запросов

14
мин.

Similar Articles Icon