阅读量:0
工厂模式(Factory Pattern)是一种创建型设计模式,它提供了一种创建对象的最佳方法
使用抽象基类:定义一个抽象基类,该类包含所有可能子类的通用接口。这样,客户端代码只需要与抽象基类交互,而不是与具体的子类交互。
使用注册表:为了避免在工厂类中硬编码所有可能的子类,可以使用注册表来存储子类的创建函数。这样,当需要添加新的子类时,只需将其添加到注册表中,而无需修改工厂类。
使用智能指针:返回智能指针(如std::unique_ptr或std::shared_ptr)而不是原始指针,以确保正确地管理内存。
使用参数化工厂:如果需要根据不同的参数创建不同类型的对象,可以使用参数化工厂。这样,工厂类可以根据传入的参数来决定创建哪种类型的对象。
使用单例模式:如果工厂类只需要一个实例,可以使用单例模式来确保只创建一个实例。
下面是一个简单的C++工厂模式示例:
#include<iostream> #include<memory> #include <unordered_map> #include<functional> // 抽象基类 class Product { public: virtual void use() = 0; }; // 具体产品A class ConcreteProductA : public Product { public: void use() override { std::cout << "Using ConcreteProductA"<< std::endl; } }; // 具体产品B class ConcreteProductB : public Product { public: void use() override { std::cout << "Using ConcreteProductB"<< std::endl; } }; // 工厂类 class Factory { public: using Creator = std::function<std::unique_ptr<Product>()>; static void registerCreator(const std::string& name, Creator creator) { getRegistry()[name] = creator; } static std::unique_ptr<Product> create(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, Creator>& getRegistry() { static std::unordered_map<std::string, Creator> registry; return registry; } }; // 注册具体产品 int main() { Factory::registerCreator("A", []() { return std::make_unique<ConcreteProductA>(); }); Factory::registerCreator("B", []() { return std::make_unique<ConcreteProductB>(); }); // 使用工厂创建产品 auto productA = Factory::create("A"); auto productB = Factory::create("B"); productA->use(); productB->use(); return 0; }
这个示例展示了如何使用工厂模式创建不同类型的产品,并使用注册表来避免硬编码所有可能的子类。