Предположим, вы имеете какой-то набор сущностей, объединённых в одну группу. Например, роли сущностей играют спортивные клубы, а объединяющей их составляющей является спорт. Так как спорт это общее понятие, которым можно объединить спортивные клубы, то можно создать класс Sport и унаследовать от него какие-то спортивные клубы, например футбольный и баскетбольный.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class Sport{}; //<--- Общее обозначение всех элементов группы /*ФУТБОЛЬНЫЕ КЛУБЫ*/ class FC_Barselona:public Sport{}; //<--- Футбольный клуб "Барселона" class FC_Spartak:public Sport{}; //<--- Футбольный клуб "Спартак" /*БАСКЕТБОЛЬНЫЕ КЛУБЫ*/ class BC_Unics :public Sport{}; //<--Баскетбольный клуб "Уникс" class BC_Fenix:public Sport{}; //<--Баскетбольный клуб "Феникс" int main() { } |
Под фабричным методом можно понимать, что будет использоваться такой процесс написания кода, где для создания любого спортивного клуба будет описан класс, который возьмёт на себя обязательства по созданию спортивного клуба, причём сам этот класс своими "руками" создавать спортивные клубы не станет, он свалит такую не царскую обязанность на своих подчинённых (на своих потомков). Как это всё выглядит? Пока весь код описывается в общих чертах. Это своеобразный чертёж программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Sport{}; //<--- Общее обозначение всех элементов группы /*ФУТБОЛЬНЫЕ КЛУБЫ*/ class FC_Barselona:public Sport{}; //<--- Футбольный клуб "Барселона" class FC_Spartak:public Sport{}; //<--- Футбольный клуб "Спартак" /*БАСКЕТБОЛЬНЫЕ КЛУБЫ*/ class BC_Unics :public Sport{}; //<--Баскетбольный клуб "Уникс" class BC_Fenix:public Sport{}; //<--Баскетбольный клуб "Феникс" /////////////////////////////////////////////////////////////// class ClubCreator{}; //<--- Привет, я - царь; Обозначает создание клуба class FC_Barselona_Creator:public ClubCreator{}; //<-- дитё царя class FC_Spartak_Creator:public ClubCreator{}; //<-- дитё царя class FC_BC_Unics_Creator:public ClubCreator{}; //<-- дитё царя class BC_Fenix_Unics_Creator:public ClubCreator{}; //<-- дитё царя int main() { } |
Дальше подходим к элементам описания внутренностей нашего создающего класса или точнее внутренностей "царя" и всех его потомков.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
class Sport{}; //<--- Общее обозначение всех элементов группы /*ФУТБОЛЬНЫЕ КЛУБЫ*/ class FC_Barselona:public Sport{}; //<--- Футбольный клуб "Барселона" class FC_Spartak:public Sport{}; //<--- Футбольный клуб "Спартак" /*БАСКЕТБОЛЬНЫЕ КЛУБЫ*/ class BC_Unics :public Sport{}; //<--Баскетбольный клуб "Уникс" class BC_Fenix:public Sport{}; //<--Баскетбольный клуб "Феникс" /////////////////////////////////////////////////////////////// class ClubCreator{ //<--- Привет, я - царь; Обозначает создание клуба public: virtual Sport* factoryMethod() = 0; virtual ~ClubCreator(){}; }; class FC_Barselona_Creator:public ClubCreator{ //<-- дитё царя public: Sport* factoryMethod(){ return new FC_Barselona; //<-- Выделяет память для объекта клуб "Барселона" } }; class FC_Spartak_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new FC_Spartak; //<-- Выделяет память для объекта клуб "Спартак" } }; class BC_Unics_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new BC_Unics; } }; class BC_Fenix_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new BC_Fenix; } }; int main() { } |
Всё, фабричный метод применён. Вопрос только в том, как его использовать. Для начала напоминаю:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
#include <vector> using std::vector; class Sport{}; //<--- Общее обозначение всех элементов группы /*ФУТБОЛЬНЫЕ КЛУБЫ*/ class FC_Barselona:public Sport{}; //<--- Футбольный клуб "Барселона" class FC_Spartak:public Sport{}; //<--- Футбольный клуб "Спартак" /*БАСКЕТБОЛЬНЫЕ КЛУБЫ*/ class BC_Unics :public Sport{}; //<--Баскетбольный клуб "Уникс" class BC_Fenix:public Sport{}; //<--Баскетбольный клуб "Феникс" /////////////////////////////////////////////////////////////// class ClubCreator{ //<--- Привет, я - царь; Обозначает создание клуба public: virtual Sport* factoryMethod() = 0; virtual ~ClubCreator(){}; }; class FC_Barselona_Creator:public ClubCreator{ //<-- дитё царя public: Sport* factoryMethod(){ return new FC_Barselona; //<-- Выделяет память для объекта клуб "Барселона" } }; class FC_Spartak_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new FC_Spartak; //<-- Выделяет память для объекта клуб "Спартак" } }; class BC_Unics_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new BC_Unics; } }; class BC_Fenix_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new BC_Fenix; } }; int main() { FC_Barselona_Creator Barselona_Creator; /*Создаём базу спортивных клубов */ FC_Spartak_Creator Spartak_Creator; BC_Unics_Creator Unix_Creator; BC_Fenix_Creator Fenix_Creator; ClubCreator *FC_Barselona = &Barselona_Creator; // Создаём ссылки на футбольные клубы ClubCreator *FC_Spartak = &Spartak_Creator; vector<Sport*> foot_clubs; //Создаём массив футбольных клубов foot_clubs.emplace_back(FC_Barselona->factoryMethod()); //Заполняем массив футбольными клубами foot_clubs.emplace_back(FC_Spartak->factoryMethod()); ClubCreator *BC_Unics = &Barselona_Creator; //Создаём ссылки на баскетбольные клубы ClubCreator *BC_Fenix = &Fenix_Creator; vector<Sport*> basket_clubs; //создаём массив баскетбольных клубов basket_clubs.emplace_back(BC_Unics->factoryMethod()); //Заполняем массив баскетбольных клубов basket_clubs.emplace_back(BC_Fenix->factoryMethod()); for (auto it=foot_clubs.begin(); it!=foot_clubs.end();it++) delete *it; //Чистим память обходом for (auto it=basket_clubs.begin(); it!=basket_clubs.end();it++) delete *it; //каждого массива } |
Это готовая программа. Она ничего не выведет на экран, потому что наши спортивные клубы не имеют реализаций. Но если описать какие-то методы, то с помощью обхода массива несложно будет использовать методы, принадлежащие какому-то определённому спортивному клубу. Пример на футбольных клубах (баскетбольные не дописаны).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
#include <vector> #include <iostream> using std::vector; using std::cout; class Sport{ //<--- Общее обозначение всех элементов группы public: virtual void transfer() {}; virtual ~Sport(){} }; /*ФУТБОЛЬНЫЕ КЛУБЫ*/ class FC_Barselona:public Sport{//<--- Футбольный клуб "Барселона" public: void transfer(){ cout << "Barselona's tranfer\n"; } }; class FC_Spartak:public Sport{//<--- Футбольный клуб "Спартак" public: void transfer(){ cout << "Spartak's tranfer\n"; } }; /*БАСКЕТБОЛЬНЫЕ КЛУБЫ*/ class BC_Unics :public Sport{}; //<--Баскетбольный клуб "Уникс" class BC_Fenix:public Sport{}; //<--Баскетбольный клуб "Феникс" /////////////////////////////////////////////////////////////// class ClubCreator{ //<--- Привет, я - царь; Обозначает создание клуба public: virtual Sport* factoryMethod() = 0; virtual ~ClubCreator(){}; }; class FC_Barselona_Creator:public ClubCreator{ //<-- дитё царя public: Sport* factoryMethod(){ return new FC_Barselona; //<-- Выделяет память для объекта клуб "Барселона" } }; class FC_Spartak_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new FC_Spartak; //<-- Выделяет память для объекта клуб "Спартак" } }; class BC_Unics_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new BC_Unics; } }; class BC_Fenix_Creator:public ClubCreator{ //<-- дитё царя Sport* factoryMethod(){ return new BC_Fenix; } }; int main() { FC_Barselona_Creator Barselona_Creator; /*Создаём базу спортивных клубов */ FC_Spartak_Creator Spartak_Creator; BC_Unics_Creator Unix_Creator; BC_Fenix_Creator Fenix_Creator; ClubCreator *FC_Barselona = &Barselona_Creator; // Создаём ссылки на футбольные клубы ClubCreator *FC_Spartak = &Spartak_Creator; vector<Sport*> foot_clubs; //Создаём массив футбольных клубов foot_clubs.emplace_back(FC_Barselona->factoryMethod()); //Заполняем массив футбольными клубами foot_clubs.emplace_back(FC_Spartak->factoryMethod()); ClubCreator *BC_Unics = &Barselona_Creator; //Создаём ссылки на баскетбольные клубы ClubCreator *BC_Fenix = &Fenix_Creator; vector<Sport*> basket_clubs; //создаём массив баскетбольных клубов basket_clubs.emplace_back(BC_Unics->factoryMethod()); //Заполняем массив баскетбольных клубов basket_clubs.emplace_back(BC_Fenix->factoryMethod()); ////////////////////////////////// for (auto it=foot_clubs.begin(); it!=foot_clubs.end();it++) (*it)->transfer(); ////////////////////////////////// for (auto it=foot_clubs.begin(); it!=foot_clubs.end();it++) delete *it; //Чистим память обходом for (auto it=basket_clubs.begin(); it!=basket_clubs.end();it++) delete *it; //каждого массива } |
Ничего не понятно на 3 курсе программирования, но очень интересно 🙄 🙄 🙄