Skip to content

Instantly share code, notes, and snippets.

@vlaleli
Created March 25, 2026 20:53
Show Gist options
  • Select an option

  • Save vlaleli/c5a5b1401da9020f95e3a8179eea1223 to your computer and use it in GitHub Desktop.

Select an option

Save vlaleli/c5a5b1401da9020f95e3a8179eea1223 to your computer and use it in GitHub Desktop.
#include <iostream>
#include <string>
#include <vector>
#include <memory>
#include <iomanip>
using namespace std;
class Car {
private:
string name;
string body;
int enginePower;
int wheelRadius;
string transmission;
public:
void setName(const string& v) { name = v; }
void setBody(const string& v) { body = v; }
void setEnginePower(int v) { enginePower = v; }
void setWheelRadius(int v) { wheelRadius = v; }
void setTransmission(const string& v) { transmission = v; }
void show() const {
cout << left
<< setw(18) << name
<< setw(15) << body
<< setw(15) << enginePower
<< setw(15) << wheelRadius
<< setw(15) << transmission
<< endl;
}
};
class CarBuilder {
protected:
Car* car;
public:
virtual ~CarBuilder() {}
void createCar() {
car = new Car();
}
virtual void buildName() = 0;
virtual void buildBody() = 0;
virtual void buildEngine() = 0;
virtual void buildWheels() = 0;
virtual void buildTransmission() = 0;
Car* getCar() {
return car;
}
};
class DaewooLanosBuilder : public CarBuilder {
public:
void buildName() override { car->setName("Daewoo Lanos"); }
void buildBody() override { car->setBody("Седан"); }
void buildEngine() override { car->setEnginePower(98); }
void buildWheels() override { car->setWheelRadius(13); }
void buildTransmission() override { car->setTransmission("5 Manual"); }
};
class FordProbeBuilder : public CarBuilder {
public:
void buildName() override { car->setName("Ford Probe"); }
void buildBody() override { car->setBody("Купе"); }
void buildEngine() override { car->setEnginePower(160); }
void buildWheels() override { car->setWheelRadius(14); }
void buildTransmission() override { car->setTransmission("4 Auto"); }
};
class UAZPatriotBuilder : public CarBuilder {
public:
void buildName() override { car->setName("UAZ Patriot"); }
void buildBody() override { car->setBody("Универсал"); }
void buildEngine() override { car->setEnginePower(120); }
void buildWheels() override { car->setWheelRadius(16); }
void buildTransmission() override { car->setTransmission("4 Manual"); }
};
class HyundaiGetzBuilder : public CarBuilder {
public:
void buildName() override { car->setName("Hyundai Getz"); }
void buildBody() override { car->setBody("Хетчбэк"); }
void buildEngine() override { car->setEnginePower(66); }
void buildWheels() override { car->setWheelRadius(13); }
void buildTransmission() override { car->setTransmission("4 Auto"); }
};
class Shop {
public:
Car* construct(CarBuilder& builder) {
builder.createCar();
builder.buildName();
builder.buildBody();
builder.buildEngine();
builder.buildWheels();
builder.buildTransmission();
return builder.getCar();
}
};
void printLine() {
cout << setfill('-') << setw(78) << "-" << setfill(' ') << endl;
}
void printHeader() {
printLine();
cout << left
<< setw(18) << "Имя"
<< setw(15) << "Корпус"
<< setw(15) << "Двигатель"
<< setw(15) << "Колеса"
<< setw(15) << "КПП"
<< endl;
printLine();
}
int main() {
Shop shop;
DaewooLanosBuilder b1;
FordProbeBuilder b2;
UAZPatriotBuilder b3;
HyundaiGetzBuilder b4;
vector<Car*> cars;
cars.push_back(shop.construct(b1));
cars.push_back(shop.construct(b2));
cars.push_back(shop.construct(b3));
cars.push_back(shop.construct(b4));
cout << "Сборка автомобилей (Builder)\n";
printHeader();
for (auto car : cars) {
car->show();
}
printLine();
for (auto car : cars) {
delete car;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment