
Лаб. 2 ПиАПС
.docxЛ а б о р а т о р н а я р а б о т а № 2
«Реализация одного из порождающих паттерны проектирования»
Цель работы: Применение паттерна проектирования Builder (строитель)
#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 TaxiPassenger {
public:
virtual void info() = 0;
};
class TaxiAdultPassenger : public TaxiPassenger {
public:
void info() override {
cout << "TaxiAdultPassenger" << endl;
}
};
class TaxiChildPassenger : public TaxiPassenger {
public:
void info() override {
cout << "TaxiChildPassenger" << endl;
}
};
class BusPassenger {
public:
virtual void info() = 0;
};
class BusAdultPassenger : public BusPassenger {
public:
void info() override {
cout << "BusAdultPassenger" << endl;
}
};
class BusChildPassenger : public BusPassenger {
public:
void info() override {
cout << "BusChildPassenger" << endl;
}
};
class BusPreferentialPassenger : public BusPassenger {
public:
void info() override {
cout << "BusPreferentialPassenger" << endl;
}
};
class People {
public:
Driver* d;
vector<TaxiPassenger*> vtp;
vector<BusPassenger*> vbp;
void info() {
int i;
d->info();
for (i = 0; i < vtp.size(); ++i) vtp[i]->info();
for (i = 0; i < vbp.size(); ++i) vbp[i]->info();
}
};
class BoardAnyCar {
protected:
People* p;
const int minCapacity = 1;
int maxCapacity;
bool boardingFailed;
public:
BoardAnyCar(int maxC): p(nullptr), maxCapacity(maxC), boardingFailed(false) {}
virtual ~BoardAnyCar() {}
virtual void boardPeople() {}
virtual void boardDriver() {}
virtual void boardTaxiPassenger(int adult, int child, int preferential) {}
virtual void boardBusPassenger(int adult, int child, int preferential) {}
virtual People* getPeople() {
if (boardingFailed) return nullptr;
return p;
}
void setBoardingFailed() { boardingFailed = true; }
};
class BoardTaxi : public BoardAnyCar {
public:
BoardTaxi() : BoardAnyCar(4) {}
void boardPeople() override { p = new People(); }
void boardDriver() override { p->d = TaxiDriver::getInstance(); }
void boardTaxiPassenger(int adult, int child, int preferential) override {
int totalPassengers = adult + child;
if (totalPassengers < minCapacity || totalPassengers > maxCapacity) {
cout << "Taxi:" << endl;
cout << "Ошибка: недопустимое количество пассажиров." << endl;
cout << "Максимально допустимое число: " << maxCapacity
<< ", минимально: " << minCapacity << endl;
setBoardingFailed();
}
for (int i = 0; i < adult; i++) {
p->vtp.push_back(new TaxiAdultPassenger());
}
for (int i = 0; i < child; i++) {
p->vtp.push_back(new TaxiChildPassenger());
}
}
};
class BoardBus : public BoardAnyCar {
public:
BoardBus() : BoardAnyCar(30) {}
void boardPeople() override { p = new People(); }
void boardDriver() override { p->d = BusDriver::getInstance(); }
void boardBusPassenger(int adult, int child, int preferential) override {
int totalPassengers = adult + child + preferential;
if (totalPassengers < minCapacity || totalPassengers > maxCapacity) {
cout << "Bus:" << endl;
cout << "Ошибка: недопустимое количество пассажиров." << endl;
cout << "Максимально допустимое число: " << maxCapacity
<< ", минимально: " << minCapacity << endl;
setBoardingFailed();
}
for (int i = 0; i < adult; i++) {
p->vbp.push_back(new BusAdultPassenger());
}
for (int i = 0; i < child; i++) {
p->vbp.push_back(new BusChildPassenger());
}
for (int i = 0; i < preferential; i++) {
p->vbp.push_back(new BusPreferentialPassenger());
}
}
};
class Director {
public:
People* boardPeople(BoardAnyCar& boarding, int adult, int child, int preferential) {
boarding.boardPeople();
boarding.boardDriver();
boarding.boardTaxiPassenger(adult, child, preferential);
boarding.boardBusPassenger(adult, child, preferential);
return boarding.getPeople();
}
};
int main() {
setlocale(LC_ALL, "rus");
Director dir;
BoardTaxi boardTaxi;
BoardBus boardBus;
int taxiAdult = 2;
int taxiChild = 1;
const int taxiPreferential = 0;
int busAdult = 4;
int busChild = 2;
int busPreferential = 1;
People* taxiPeople = dir.boardPeople(boardTaxi, taxiAdult, taxiChild, taxiPreferential);
People* busPeople = dir.boardPeople(boardBus, busAdult, busChild, busPreferential);
if (taxiPeople) {
cout << "Taxi:" << endl;
taxiPeople->info();
delete taxiPeople;
}
cout << endl;
if (busPeople) {
cout << "Bus:" << endl;
busPeople->info();
delete busPeople;
}
return 0;
}