在 C++ 中,設計高效的工廠通常涉及到以下幾個關鍵方面:
std::unique_ptr
和 std::shared_ptr
)可以自動管理內存,避免內存泄漏,并提供更好的異常安全性。以下是一個簡單的示例,展示了如何使用注冊表模式和智能指針實現(xiàn)高效的工廠:
#include<iostream>
#include<memory>
#include <unordered_map>
#include<functional>
// 抽象基類
class Shape {
public:
virtual ~Shape() = default;
virtual void draw() const = 0;
};
// 具體類
class Circle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a circle"<< std::endl;
}
};
class Rectangle : public Shape {
public:
void draw() const override {
std::cout << "Drawing a rectangle"<< std::endl;
}
};
// 工廠類
class ShapeFactory {
public:
using ShapeCreator = std::function<std::unique_ptr<Shape>()>;
static void registerShape(const std::string& name, ShapeCreator creator) {
getRegistry()[name] = creator;
}
static std::unique_ptr<Shape> createShape(const std::string& name) {
auto it = getRegistry().find(name);
if (it != getRegistry().end()) {
return it->second();
}
return nullptr;
}
private:
static std::unordered_map<std::string, ShapeCreator>& getRegistry() {
static std::unordered_map<std::string, ShapeCreator> registry;
return registry;
}
};
// 注冊具體類
int main() {
ShapeFactory::registerShape("circle", []() { return std::make_unique<Circle>(); });
ShapeFactory::registerShape("rectangle", []() { return std::make_unique<Rectangle>(); });
auto shape1 = ShapeFactory::createShape("circle");
auto shape2 = ShapeFactory::createShape("rectangle");
shape1->draw();
shape2->draw();
return 0;
}
這個示例展示了如何使用注冊表模式和智能指針實現(xiàn)一個簡單的形狀工廠。你可以根據(jù)需要擴展這個示例,以支持更多的形狀類型和更復雜的創(chuàng)建邏輯。