Below is a C++ implementation of the Builder design pattern, a Creational pattern, following the Gang of Four (GoF) structure. Each class is placed in its own .h and .cpp files, with the order of creation designed to avoid dependency issues.
✅ Class Creation Order (to avoid dependency errors)
- Product (The complex object being built)
- Builder (Abstract builder interface)
- ConcreteBuilder (Implements construction steps)
- Director (Orchestrates the building process)
- Client Code (
main.cpp)
🔧 1. Product.h
#ifndef PRODUCT_H
#define PRODUCT_H
#include <string>
#include <vector>
class Product {
private:
std::vector<std::string> parts;
public:
void addPart(const std::string& part);
void show() const;
};
#endif // PRODUCT_H
🔧 Product.cpp
#include "Product.h"
#include <iostream>
void Product::addPart(const std::string& part) {
parts.push_back(part);
}
void Product::show() const {
std::cout << "Product parts: ";
for (const auto& part : parts) {
std::cout << part << " ";
}
std::cout << std::endl;
}
🧱 2. Builder.h
#ifndef BUILDER_H
#define BUILDER_H
#include "Product.h"
// Abstract Builder
class Builder {
public:
virtual void buildPartA() = 0;
virtual void buildPartB() = 0;
virtual Product* getResult() = 0;
virtual ~Builder() {}
};
#endif // BUILDER_H
🧱 3. ConcreteBuilder.h
#ifndef CONCRETEBUILDER_H
#define CONCRETEBUILDER_H
#include "Builder.h"
// Concrete Builder
class ConcreteBuilder : public Builder {
private:
Product* product;
public:
ConcreteBuilder();
~ConcreteBuilder();
void buildPartA() override;
void buildPartB() override;
Product* getResult() override;
};
#endif // CONCRETEBUILDER_H
🧱 ConcreteBuilder.cpp
#include "ConcreteBuilder.h"
ConcreteBuilder::ConcreteBuilder() {
product = new Product();
}
ConcreteBuilder::~ConcreteBuilder() {
delete product;
}
void ConcreteBuilder::buildPartA() {
product->addPart("PartA");
}
void ConcreteBuilder::buildPartB() {
product->addPart("PartB");
}
Product* ConcreteBuilder::getResult() {
return product;
}
🎯 4. Director.h
#ifndef DIRECTOR_H
#define DIRECTOR_H
#include "Builder.h"
// Director
class Director {
public:
void construct(Builder* builder);
};
#endif // DIRECTOR_H
🎯 Director.cpp
#include "Director.h"
void Director::construct(Builder* builder) {
builder->buildPartA();
builder->buildPartB();
}
👨💻 5. main.cpp
#include <iostream>
#include "Director.h"
#include "ConcreteBuilder.h"
int main() {
Director director;
ConcreteBuilder builder;
director.construct(&builder);
Product* product = builder.getResult();
product->show();
return 0;
}
🧠Summary & Explanation
| Class/File | Role |
|---|---|
Product | The complex object that is built step by step. |
Builder | Abstract interface that defines methods for building the parts. |
ConcreteBuilder | Implements the building steps and returns the final product. |
Director | Controls the order of building steps, using a Builder. |
main.cpp | The client code that puts it all together. |
✅ Benefits of the Builder Pattern in C++
- Encapsulates complex construction logic.
- Supports multiple representations of a product.
- Promotes separation of concerns (product vs. construction steps).
No comments:
Post a Comment