Абстрактна фабрика

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Абстра́ктна фа́брика (англ. Abstract Factory) — шаблон проектування, що забезпечує інкапсуляцію окремих фабрик під єдиною схемою, упускаючи їх деталізацію. Відноситься до класу твірних шаблонів.

В типових випадках застосування, клієнтський код створює конкретну реалізацію абстрактної фабрики, а потів використовує загальний універсальний інтерфейс фабрики, для створення екземплярів об'єктів, які є частиною схеми. Клієнтський код не знає (або не бере до уваги), які саме конкретно об'єкти він отримує від цих фабрик, оскільки він використовує універсальний інтерфейс для їх створення. Шаблон розмежовує деталі реалізації множини об'єктів від їх загального використання в коді, оскільки створення об'єкта здійснюється за допомогою методів, що забезпечуються інтерфейсом фабрики.[1]

Призначення[ред.ред. код]

Подає інтерфейс для утворення родин взаємозв'язаних або взаємозалежних об'єктів, не специфікуючи їхніх конкретних класів.

Застосування[ред.ред. код]

Слід використовувати шаблон Абстрактна фабрика коли:

  • система не повинна залежати від того, як утворюються, компонуються та представляються вхідні до неї об'єкти;
  • вхідні до родини взаємозв'язані об'єкти повинні використовуватися разом і необхідно забезпечити виконання цього обмеження;
  • система повинна конфігуруватися однією з родин складаючих її об'єктів;
  • треба подати бібліотеку об'єктів, розкриваючи тільки їхні інтерфейси, але не реалізацію.

Структура[ред.ред. код]

UML діаграма, що описує структуру шаблону проектування Абстрактна фабрика
  • AbstractFactory — абстрактна фабрика:
    • оголошує інтерфейс для операцій, що створюють абстрактні об'єкти-продукти;
  • ConcreteFactory — конкретна фабрика:
    • реалізує операції, що створюють конкретні об'єкти-продукти;
  • AbstractProduct — абстрактний продукт:
    • оголошує інтерфейс для типу об'єкта-продукту;
  • ConcreteProduct — конкретний продукт:
    • визначає об'єкт-продукт, що створюється відповідною конкретною фабрикою;
    • реалізує інтерфейс AbstractProduct;
  • Client — клієнт:
    • користується виключно інтерфейсами, котрі оголошенні у класах AbstractFactory та AbstractProduct.

Відносини[ред.ред. код]

  • Зазвичай під час виконання створюється єдиний екземпляр класу ConcreteFactory. Ця конкретна фабрика створює об'єкти продукти, що мають досить визначену реалізацію. Для створення інших видів об'єктів клієнт повинен користуватися іншою конкретною фабрикою;
  • AbstractFactory передоручає створення об'єктів продуктів своєму підкласу ConcreteFactory.

Реалізація[ред.ред. код]

Приклад С++[ред.ред. код]

#include "stdafx.h";
#include <string>
#include <iostream>
 
// AbstractFactory
class CCarFactory
{
public:
	virtual void SetName() = 0;
	virtual void SetColor() = 0;
	virtual void SetWeight() = 0;
 
	virtual void ShowInfo() = 0;
};
 
// ConcreteFactory1
class CMercedesFactory: public CCarFactory
{
public:
	CMercedesFactory() {};
	virtual ~CMercedesFactory() {};
 
	virtual void SetName() {
		strName = "Mercedes SLR McLaren";
	};
 
	virtual void SetColor() {
		strColor = "Silver";
	};
 
	virtual void SetWeight() {
		nWeight = 1768;
	};
 
	virtual void ShowInfo() {
		std::cout << strName << std::endl;
		std::cout << strColor << std::endl;
		std::cout << nWeight << std::endl;
	};
 
private:
	std::string strName;
	std::string strColor;
	int nWeight;
};
 
// ConcreteFactory2
class CBMWFactory: public CCarFactory
{
public:
	CBMWFactory() {};
	virtual ~CBMWFactory() {};
 
	virtual void SetName() {
		strName = "BMW Z4 M";
	};
 
	virtual void SetColor() {
		strColor = "Black";
	};
 
	virtual void SetWeight() {
		nWeight = 1495;
	};
 
	virtual void ShowInfo() {
		std::cout << strName << std::endl;
		std::cout << strColor << std::endl;
		std::cout << nWeight << std::endl;
	};
 
private:
	std::string strName;
	std::string strColor;
	int nWeight;
};
 
// Client, car - AbstractProduct
void CreateCar(CCarFactory& car)
{
	car.SetName();
	car.SetColor();
	car.SetWeight();
};
 
int _tmain(int argc, _TCHAR* argv[])
{
	// MyOldCar, MyNewCar - ConcreteProducts
	CBMWFactory MyOldCar;
	CMercedesFactory MyNewCar;
 
	CreateCar(MyOldCar);
	CreateCar(MyNewCar);
 
	MyOldCar.ShowInfo();
	MyNewCar.ShowInfo();
 
	return 0;
}

Примітки[ред.ред. код]

  1. Head First Design Patterns (paperback) 1 O'REILLY (2004). Процитовано 2012-09-12.

Джерела[ред.ред. код]

Література[ред.ред. код]

Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5