
Лаб. 1 ПиАПС
.docxЛ а б о р а т о р н а я р а б о т а № 1
«Реализация одного из порождающих паттерны проектирования»
Цель работы: Научиться применять порождающие паттерны проектирования.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Driver {
protected:
Driver() {}
virtual ~Driver() {}
;
public:
virtual void info() = 0;
Driver(const Driver&) = delete;
Driver& operator=(const Driver&) = delete;
};
class TaxiDriver : public Driver {
static TaxiDriver* instance; // переменная для единственного экземпляра объекта
TaxiDriver() {} // приватный конструктор для запрета создания объекта вне класса
public:
static TaxiDriver* getInstance() { // метод для создания единственного экзепляра класса
if (instance == nullptr) {
instance = new TaxiDriver();
}
return instance;
}
void info() override {
cout << "*TaxiDriver*" << endl;
}
};
class BusDriver : public Driver {
static BusDriver* instance;
BusDriver() {}
public:
static BusDriver* getInstance() {
if (instance == nullptr) {
instance = new BusDriver();
}
return instance;
}
void info() override {
cout << "*BusDriver*" << endl;
}
};
// объявление и инициализация статических указателей
TaxiDriver* TaxiDriver::instance = nullptr;
BusDriver* BusDriver::instance = nullptr;
class Passenger {
public:
//string name;
//Passenger(string n) : name(n) {}
void info() {
cout << "Passenger" << endl;
}
};
class BoardAnyCar {
protected:
//bool flagDriver;
//vector<Passenger> passengers;
//int maxCapacity;
public:
virtual Driver* boardingDriver() = 0;
Passenger* boardingPassenger() {
return new Passenger();
}
virtual ~BoardAnyCar() {}
};
class BoardTaxi : public BoardAnyCar {
public:
Driver* boardingDriver() override {
return TaxiDriver::getInstance();
}
};
class BoardBus : public BoardAnyCar {
public:
Driver* boardingDriver() override {
return BusDriver::getInstance();
}
};
class People {
public:
vector<Passenger*> vp;
Driver* d;
void info() {
int i;
d->info();
for (i = 0; i < vp.size(); ++i) vp[i]->info();
}
~People() {
int i;
for (i = 0; i < vp.size(); ++i) delete vp[i];
}
};
class Boarding {
public:
People* boardingPeople(BoardAnyCar& boarding, Driver* driver, int numPassengers) {
int maxCapacity = 0;
string s;
//Driver* driver = boarding.boardingDriver();
if (dynamic_cast<BoardTaxi*>(&boarding)) {
maxCapacity = 4;
s = "Taxi:";
if (driver != TaxiDriver::getInstance()) {
//if (dynamic_cast<TaxiDriver*>(driver)) {
cout << s << endl;
cout << "Ошибка: водитель автобуса не может управлять такси!" << endl;
return nullptr;
}
}
else if (dynamic_cast<BoardBus*>(&boarding)) {
maxCapacity = 30;
s = "Bus:";
if (driver != BusDriver::getInstance()) {
//if (!dynamic_cast<BusDriver*>(driver)) {
cout << s << endl;
cout << "Ошибка: водитель такси не может управлять автобусом!" << endl;
return nullptr;
}
}
if (numPassengers < 1 || numPassengers > maxCapacity) {
cout << s << endl;
cout << "Ошибка: недопустимое количество пассажиров." << endl;
cout << "Максимально допустимое число: " << maxCapacity << ", минимально: 1." << endl;
return nullptr;
}
People* p = new People();
p->d = driver;
for (int i = 0; i < numPassengers; i++) {
p->vp.push_back(boarding.boardingPassenger());
}
return p;
}
};
int main() {
setlocale(LC_ALL, "rus");
Boarding boarding;
BoardTaxi boardTaxi;
BoardBus boardBus;
int taxiPassengers = 2;
int busPassengers = 3;
Driver* taxiDriver = TaxiDriver::getInstance();
Driver* busDriver = BusDriver::getInstance();
People* taxiPeople = boarding.boardingPeople(boardTaxi, taxiDriver, taxiPassengers);
People* busPeople = boarding.boardingPeople(boardBus, busDriver, busPassengers);
if (taxiPeople) {
cout << "Taxi:" << endl;
taxiPeople->info();
delete taxiPeople;
}
cout << endl;
if (busPeople) {
cout << "Bus:" << endl;
busPeople->info();
delete busPeople;
}
return 0;
}