|
Программирование >> Разработка устойчивых систем
void MountainBikeBuilder::buildWheelО { product ->addPa rt(new Bi cyclePa rt(Bi cycl ePa rt: void MountainBikeBuilder::buildSeat() { product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt: void MountainBikeBuilder::buildDerailleur() { product->addPart( new BicyclePart(BicyclePart::DERAILLEUR)): void MountainBikeBuilder::buildHandlebar() { product->addPart( new BicyclePart(BicyclePart::HANDLEBAR)): void MountainBikeBuilder::buildSprocket() { product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt: void MountainBikeBuilder void MountainBikeBuilder :buildRack() {} :buildShock() { :WHEEL)): :SEAT)): :SPROCKET)): product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt::SHOCK)): Реализация TouringBikeBuilder void TouringBikeBuilder::buildFrame() { product->addPa rt(new Bi cyclePa rt(Bi cyclePa rt::FRAME)): void TouringBikeBuilder::buildWheelО { product->addPart(new BicyclePart(BicyclePart::WHEEL)): publ1с: BicycleTechnicianO { builder = 0: } void setBuilder(BicycleBuilder* b) { builder = b: } void constructO: #endif BICYCLE H /:- Класс Bicycle содержит eeicrop указателей на объекты BicyclePart, которые представляют части, используемые при сборке велосипедов. Чтобы начать сборку велосипеда, BicycleTechnician ( руководитель в этом примере) вызывает Bi cycle Builder: tcreate-productO для производного объекта BicycleBuilder. Функция BicycleTechnician::construct() вызывает все функции интерфейса BicycleBuilder (поскольку она не знает, с каким конкретным типом строителя имеет дело). Конкретные классы строителей опускают (через пустые тела функций) те действия, которые не относятся к типу собираемого велосипеда, как видно из следующего файла реализации: : C10:Bicycle.cpp {0} {-mwcc} finclude Bicycle.h finclude <cassert> finclude <cstddef> using namespace std: std::string BicyclePart::names[NPARTS] = { Frame . Wheel . Seat . Derailleur . Handlebar . Sprocket . Rack . Shock }: Реализация MountainBikeBuilder void MountainBikeBuilder::buildFrame() { product->addPart(new BicyclePart(BicyclePart::FRAME)): void TouringBikeBuilder::buildSeatO { product->addPart(new BicyclePartCBicyclePart::SEAT)): void TouringBikeBuilder::buildDerailleur() { product->addPart( new BicyclePartCBicyclePart::DERAILLEUR)): void TouringBikeBuilder::buildHandlebarO { product->addPart( new BicyclePartCBicyclePart::HANDLEBAR)): void TouringBikeBuilder::buildSprocketC) { product->addPartС new BicyclePartCBicyclePart::SPROCKET)): void TouringBikeBuilder::buildRackO { product->addPartCnew BicyclePartCBicyclePart::RACK)): voi d Touri ngBi keBui1der::bui1dShock О {} Реализация RacingBikeBuilder void RacingBikeBuilder::buildFrameC) { product->addPartCnew BicyclePartCBicyclePart;:FRAME)): void RacingBikeBuilder::buiIdWheelО { product->addPartС new BicyclePartCBicyclePart::WHEEL)): void RacingBikeBuilder::buildSeatO { product->addPartCnew BicyclePartCBicyclePart::SEAT)): void RacingBikeBuilder::buiIdDerai 11eurО {} void RacingBikeBuilder;:buildHandlebarC) { product->addPartC new BicyclePartCBicyclePart::HANDLEBAR)); void RacingBikeBuilder::buildSprocketO { product->addPart(new BicyclePartСBicyclePart::SPROCKET)); void RacingBikeBuilder::buildRackC) {} voi d Raci ngBi keBui1der::bui1dShock О {} Реализация BicycleTechnician void BicycleTechnician::constructC) { assertCbuilder): builder->createProductC): builder->buildFrameC): builder->buildWheelC): builder->buildSeatC): bui1der->bui1dDerai 11 eurС); builder->buildHandlebarC): bui1der->bui1dSprocket С): builder->buildRackC); builder->buildShockC); } III:- Оператор класса Bicycle вызывает соответствующий оператор для каждого объекта BicyclePart; этот объект выводит имя своего типа, чтобы вы видели, из каких частей состоит объект Bicycle. Пример: /* Вывод: Built a MountainBike : СЮ:BuiIdBicycles.срр {L} Bicycle Паттерн Строитель. #include <cstddef> #include <iostream> #include <map> #i nclude <vector> #include Bicycle.h #include ../purge.h using namespace std: Сборка велосипеда с использованием конкретного строителя. Bicycle* buildMeABikeC BicycleTechnicianS t. BicycleBuilder* builder) { t.setBuilder(builder): t.constructO: Bicycle* b = builder->getProduct(): cout Built a builder->getBikeName() endl: return b: int mainO { Заказ на велосипеды map <string. size t> order: order[ mountain ] = 2: order[ touring ] = 1: order[ racing ] = 3: Сборка велосипедов vector<Bicycle*> bikes; BicycleBuilder* m = new MountainBikeBuilder: BicycleBuilder* t = new TouringBikeBuilder; BicycleBuilder* r = new RacingBikeBuilder; BicycleTechnician tech: map<string. size t>::iterator it = order.beginO; whileCit != order.endO) { BicycleBuilder* builder; if(it->first == mountain ) builder = m; else if(it->first == touring ) builder = t; else if(it->first -= racing ) builder = r; for(size t i = 0; i < it->second: ++i) bi kes.push back(bui1dMeABi ke(tech. bui1der)); ++it: delete m; delete t; delete r; Вывод информации о велосипедах for(size t i = 0; i < bikes.sizeO: ++i) cout Bicycle: *bikes[i] endl: purge(bikes):
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |