Шаблон фабрика: ключевая информация о шаблоне фабричного метода

Более 500 000 экземпляров книги «Design Patterns: Элементы повторно используемого объектно-ориентированного программного обеспечения» было продано с момента ее выхода в 1994 году. Книга для разработчиков программного обеспечения описывает 23 различных паттерна проектирования, также известных в профессиональных кругах как паттерны проектирования «банды четырех» — термин, восходящий к именам четырех авторов Эриха Гамма, Джона Влиссидеса, Ральфа Джонсона и Ричарда Хелма.

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

Примечание

Принципы SOLID — это подмножество принципов объектно-ориентированного проектирования, которые призваны улучшить процесс разработки объектно-ориентированного программного обеспечения. Аббревиатура «SOLID» означает следующие пять принципов:

— Принцип единой ответственности: каждый класс должен иметь только одну ответственность.

— Принцип открытости-закрытости: единицы программного обеспечения должны быть расширяемыми без необходимости изменения их поведения.

— Принцип замещения Лискова: Производный класс всегда должен использоваться вместо своего базового класса.

— Принцип разделения интерфейсов: Интерфейсы должны быть идеально адаптированы к требованиям клиентов, обращающихся к ним.

— Принцип инверсии зависимостей: Классы на более высоком уровне абстракции никогда не должны зависеть от классов на более низком уровне абстракции.

Вместо обычного описания во многих случаях используется сокращенный термин «паттерн фабрика» или «паттерн проектирования фабричных методов», хотя в GoF он нигде не встречается. Если вы заглянете в книгу, то обнаружите, что — помимо рассматриваемого здесь паттерна фабричного метода — существует только аналогичный абстрактный паттерн фабрики, который определяет интерфейс для создания семейства объектов, конкретные классы которых определяются только во время выполнения.

Какова цель паттерна фабричного метода?

Шаблон фабрики призван решить фундаментальную проблему инстанцирования — то есть создания конкретного объекта класса — в объектно-ориентированном программировании. В принципе, создание объекта непосредственно внутри класса, который нуждается или должен использовать этот объект, возможно, но очень негибко. Оно привязывает класс к этому объекту и делает невозможным изменение инстанцирования независимо от класса. Подобного кода можно избежать при использовании фабричного паттерна, сначала определив отдельную операцию для создания объекта — фабричный метод. Как только он вызывается, он создает объект вместо уже упомянутого конструктора класса.

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

Шаблон фабричного метода: UML-диаграмма паттерна фабричного метода

В программном обеспечении, основанном на паттерне проектирования фабричного метода, код создаваемого объекта (в данном контексте также называемого «продуктом») выносится в отдельный класс. Этот абстрактный класс, также называемый «создателем» или — в соответствии с паттерном — «фабрикой», делегирует инстанцирование объекта подклассу (ConcreteCreator), который в конечном итоге решает, какой продукт будет создан. Для этого ConcreteCreator берет на себя метод createProduct() и возвращает ConcreteProduct, который по желанию может быть расширен создателем с помощью производственного кода, прежде чем он будет передан интерфейсу в качестве готового продукта.

Этот процесс наглядно представлен на приведенной ниже диаграмме классов UML паттерна фабрики, которая графически обобщает описанные отношения и процессы.

Плюсы и минусы паттерна проектирования фабричного метода

В паттерне фабрика вызов метода программирования полностью отделен от реализации новых классов, что имеет свои преимущества. Например, это условие оказывает особое влияние на то, как можно расширять программное обеспечение: Фабричные методы обладают высокой степенью автономности, что означает, что они позволяют добавлять новые классы без того, чтобы приложение каким-либо образом изменялось — параллельно с временем выполнения. При этом достаточно реализовать интерфейс фабрики и включить создателя соответствующим образом (через ConcreteCreator).

Еще одним преимуществом является легкая тестируемость компонентов фабрики. Например, если создатель реализует три класса, их функциональность может быть протестирована по отдельности и независимо от вызываемого класса. В случае с последним необходимо только убедиться, что он правильно вызывает создателя, даже если программное обеспечение будет расширено позднее. Еще одним преимуществом является возможность дать фабричным методам (в отличие от конструктора класса) осмысленное имя.

Самым большим недостатком фабричного паттерна проектирования является тот факт, что его реализация приводит к сильному увеличению количества интегрированных классов, поскольку каждый ConcreteProduct всегда требует ConcreteCreator. Как бы ни был выгоден фабричный подход с точки зрения расширения программного обеспечения, он также невыгоден с точки зрения требуемых усилий: Если семейство продуктов должно быть расширено, необходимо адаптировать не только интерфейс, но и все подчиненные классы ConcreteCreator. Поэтому необходимо заблаговременное планирование требуемых типов продуктов.

Преимущества Недостатки
Возможность модульного расширения приложения Большое количество необходимых классов
Хорошая тестируемость Расширение приложения очень сложное
Значительные имена методов  

Где используется паттерн фабричного метода?

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

Системы аутентификации также выигрывают от преимуществ паттерна проектирования «фабрика»: Вместо центрального класса с различными параметрами, которые меняются в зависимости от авторизации пользователя, процесс аутентификации может быть делегирован классам-фабрикам, которые принимают независимые решения о работе с соответствующим пользователем.

Кроме того, проектирование в соответствии с фабричным паттерном подходит для всех программ, в которых новые классы добавляются регулярно и по плану — особенно если эти классы должны пройти через один и тот же процесс создания.

Шаблон фабричного метода: пример (PHP)

Шаблон проектирования фабричного метода может быть использован в различных приложениях на разных языках программирования. К наиболее известным относятся Java, JavaScript, C++, C#, Python и PHP. Последний язык сценариев также используется в следующем практическом примере, который вдохновлен записью в немецком блоге Phpmonkeys.

В данном случае задан сценарий с абстрактным классом «Car» (Creator) и фабричным классом «CarFactory» (ConcreteCreator). Первый создан максимально просто и содержит только код для задания цвета автомобиля — цвет по умолчанию: белый — и для его считывания:

 

class Car {
	private $color = null;
	public function __construct() {
		$this->color = "white";
	}
	public function setColor($color) {
		$this->color = $color;
	}
	public function getColor() {
		return $this->color;
	}
}

В класс-фабрику вводятся методы для «красного» и «синего» автомобилей и приватный метод для собственно создания класса:

class CarFactory {
	private function __construct() {
	}
	public static function getBlueCar() {
		return self::getCar("blue");
	}
	public static function getRedCar() {
		return self::getCar("red");
	}
	private static function getCar($color) {
		$car = new Car();
		$car->setColor($color);
		return $car;
	}
}

Благодаря шаблону фабричного метода этот четко организованный фабричный метод теперь может быть расширен широким спектром дополнительных возможностей, таких как дополнительные цвета, марка автомобиля или его цена.

Оцените статью
cdelat.ru
Добавить комментарий