Что такое шаблоны проектирования? Шаблон Factory в Java

При проектировании того или иного программного продукта разработчик сталкивается с большим количеством проблем. И многие из этих проблем бывают ТИПИЧНЫМИ при разработке.

Так вот, чтобы разработчик сам не сидел и не выдумывал как ему решить какую-то типичную при разработке многих программных продуктов проблему, существует уже готовое решение этой проблемы, которое этот разработчик может использовать.

То есть существует шаблон, следуя которому разработчик может решить типичную проблему.

Сами подумайте, знание существующего, проверенного временем шаблона для решения типичной при построении приложения проблемы может существенно упростить разработчику жизнь. Без знания шаблонов разработчик может намудрить что-то такое, что скажется и на продуктивности, и на читабельности кода, и на другом.


Шаблон  Factory

Первый паттерн, который мы рассмотрим называется Factory(фабрика).

Factory довольно простой паттерн.

Часто в приложении может понадобиться вспомогательный объект с помощью которого можно создавать другие объекты. То есть это объект, который является фабрикой других объектов.

Важное уточнение, что фабрика создает экземпляры ОДНОТИПНЫХ классов.

В примере ниже фабрика книг производит разные книги (экземпляры этих книг).

//Тип создаваемых объектом фабрики объектов //это книга. Очевидно что все реализующие //этот интерфейс классы будут тоже книгами //только уже конкретными книгами. interface Book { void read(); } //Реализуем этот интерфейс //таким образом создавая конкретную //книгу “Властелин колец” class LordOfTheRings implements Book { public void read() { System.out.println( “Reading Lord of The Rings!”); } } //Реализуем этот интерфейс еще раз //таким образом создавая вторую //конкретную книгу “На западном фронте //без перемен.”. class AllQuietOnTheWesternFront implements Book { public void read(){ System.out.println( “Reading All Quiet On The ” + “Western Front!”); } } //Создаем класс фабрики книг. //Объект класса фабрики книг должен //уметь создавать объект любого //определенного выше класса книги. class BooksFactory { //Метод объекта фабрики ниже как раз будет //создавать объект конкретной книги. //Как можно увидеть аргументом этому методу //передается название книги объект которой //хочет создать тот кто вызывает этот метод. public Book createBook(String bookName) { switch (bookName) { //То есть как видим если аргументом методу //была передана строка “Lord Of The Rings” case “Lord Of The Rings”: //то будет создан и возвращен объект //класса LordOfTheRings. return new LordOfTheRings(); //Если аргументом методу была передана //строка “All Quiet On The Western Front” case “All Quiet On The Western Front”: //то будет создан и возвращен объект //класса AllQuietOnTheWesternFront. return new AllQuietOnTheWesternFront(); default: return null; } } } //Воспользуемся созданными классами в main методе. public class FactoryExample { public static void main(String[] args) { //Создадим объект книги “Властелин колец” //используя объект фабрики книг. Book lordOfTheRings = new BooksFactory() .createBook(“Lord Of The Rings”); //Создадим объект книги “На западном фронте //без перемен” используя объект фабрики книг. Book allQuietOnTheWestFr = new BooksFactory() .createBook(“All Quiet On The ” + “Western Front”); //Проверим успешно ли нам создала фабрика //объектов разных книг вызвав методы этих //этих книг. lordOfTheRings.read(); allQuietOnTheWestFr.read(); } }

Скомпилируем java файл и запустим программу.

Как видим, read у созданных объектов вывел на консоль разные строки. Значит BooksFactory умеет создавать РАЗНЫЕ ОДНОТИПНЫЕ объекты.

Когда применяется Factory?

Данный шаблон применяется по двум основным причинам:

1. Все объекты книг создаются одним методом.

Представьте себе приложение, которое содержит ранее написанные нами классы книг и класс фабрики книг, и которое также имеет пользовательский интерфейс.

Пусть этот интерфейс содержит поле для ввода названия книги и представьте, что то, что введет пользователь в это поле будет передано аргументом в метод фабрики createBook.

Метод фабрики createBook создаст объект той книги, которую хочет пользователь по названию, которое он ввел.

Суть в том, что тому, кто пишет программу заранее не известно, что пользователь напишет в поле для ввода в пользовательском интерфейсе, объект какой именно книги пользователь захочет создать.

То есть благодаря тому, что все объекты книг создаются одним и тем же методом, в программе создается именно тот объект, который хочет пользователь, а не программист или кто либо еще.

2. Второй важный момент, это то, что программист может добавить дополнительный функционал в класс фабрики, который может быть применен к любому создающемуся фабрикой объекту.

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

Singleton в Java: гарантия одного экземпляра класса. Пример. Сравнение с статическим классом и преимущества.

Time to read: 14

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

DAO паттерн в Java: изоляция доступа к данным. Узнайте, как отделить бизнес-логику от низкоуровневых операций с базой данных через Data Access Object.

Time to read: 13

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

Front Controller в Java: централизованная обработка запросов. Паттерн для маршрутизации HTTP-запросов через единую точку входа в веб-приложениях.

Time to read: 14