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

Лаб. 1 ПиАПС

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

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

}

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