Фабричный метод — порождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса.
В момент создания наследники могут определить, какой класс создавать.
Иными словами, Фабрика делегирует создание объектов наследникам родительского класса.
Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.
Шаблон определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.
Фабричный метод позволяет классу делегировать создание подклассов.
Используется, когда:
● классу заранее неизвестно, объекты каких подклассов ему нужно создавать.
● класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.
● класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.
Структура:
Product — продукт; определяет интерфейс объектов, создаваемых абстрактным методом.
ConcreteProduct — конкретный продукт, реализует интерфейс Product.
Creator — создатель; объявляет фабричный метод, который возвращает объект типа Product.
Может также содержать реализацию этого метода «по умолчанию»; может вызывать фабричный метод для создания объекта типа Product.
ConcreteCreator — конкретный создатель; переопределяет фабричный метод таким образом, чтобы он создавал и возвращал объект класса ConcreteProduct.
#include <iostream>
#include <vector>
// Иерархия классов персонажей
Class Bas_per
{
public:
virtual void info() = 0;
virtual ~Bas_per() {}
};
Class Person1: public Bas_per
{
public:
void info() {
cout << "Person1" << endl;
};
};
Class Person2: public Bas_per
{
public:
void info() {
cout << "Person2" << endl;
};
};
Class Person3: public Bas_per
{
public:
void info() {
cout << "Person3" << endl;
};
};
// Фабрика объектов
Class Factory
{
public:
virtual Bas_per* createPer() = 0;
virtual ~Factory() {}
};
Class P1Factory: public Factory
{
public:
Bas_per* createPer() {
return new Person1;
}
};
Class P2Factory: public Factory
{
public:
Bas_per* createPer() {
return new Person2;
}
};
Class P3Factory: public Factory
{
public:
Bas_per* createPer() {
return new Person3;
}
};
// Создание объектов при помощи фабрик объектов
Int main()
{
P1Factory* person1_factory = new P1Factory;
P2Factory* person2_factory = new P2Factory;
P2Factory* person3_factory = new P3Factory;
vector<Bas_per*> v;
v.push_back(person1_factory->createPer());
v.push_back(person2_factory->createPer());
v.push_back(person_factory->createPer());
for(int i=0; i<v.size(); i++)
v[i]->info();
//...
}
Одиночка (Singleton)