Фабричный метод (Factory Method)

Фабричный методпорождающий шаблон проектирования, предоставляющий подклассам интерфейс для создания экземпляров некоторого класса.

В момент создания наследники могут определить, какой класс создавать.

Иными словами, Фабрика делегирует создание объектов наследникам родительского класса.

Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне.

Шаблон определяет интерфейс для создания объекта, но оставляет подклассам решение о том, какой класс инстанцировать.

 Фабричный метод позволяет классу делегировать создание подклассов.

Используется, когда:

● классу заранее неизвестно, объекты каких подклассов ему нужно создавать.

● класс спроектирован так, чтобы объекты, которые он создаёт, специфицировались подклассами.

● класс делегирует свои обязанности одному из нескольких вспомогательных подклассов, и планируется локализовать знание о том, какой класс принимает эти обязанности на себя.

Структура:

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)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: