Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лаб. 2 ПиАПС

.docx
Скачиваний:
0
Добавлен:
29.05.2025
Размер:
157.08 Кб
Скачать

Л а б о р а т о р н а я р а б о т а № 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;

}

Соседние файлы в предмете Проектирование и архитектура программных систем