21xrx.com
2024-11-05 14:50:38 Tuesday
登录
文章检索 我的文章 写文章
C++中实现工厂模式和注册器模式的方法
2023-07-12 16:19:12 深夜i     --     --
C++ 工厂模式 注册器模式 实现方法

工厂模式和注册器模式是设计模式中常见的两种模式,它们都可以用来创建对象并实现对象之间的解耦。在C++中,实现这两种模式需要使用不同的方法。

工厂模式是一种创建型模式,它的目的是封装对象的创建过程,将对象的创建和使用分离开来。在C++中,可以通过定义一个抽象类或接口来表示要创建的对象,然后定义一个工厂类来实现对象的创建。具体实现代码如下:


//定义抽象类接口

class Product {

public:

  virtual void use() = 0;

  virtual ~Product(){};

};

//定义具体类

class ProductA : public Product {

public:

  void use() override

    //do something for ProductA

  

};

class ProductB : public Product {

public:

  void use() override

    //do something for ProductB

  

};

//定义工厂类

class Factory {

public:

  static std::unique_ptr<Product> createProduct(const std::string& type) {

    if (type == "A") {

      return std::make_unique<ProductA>();

    } else if (type == "B") {

      return std::make_unique<ProductB>();

    } else

      return nullptr;

    

  }

};

//使用工厂类创建对象

int main() {

  auto productA = Factory::createProduct("A");

  auto productB = Factory::createProduct("B");

  return 0;

}

上述代码定义了一个抽象类Product和两个具体类ProductA和ProductB,它们都实现了use()方法。然后定义了一个工厂类Factory,它有一个静态方法createProduct()来创建对象。在main函数中,通过调用Factory::createProduct()方法来创建对象并使用。

而注册器模式是一种行为型模式,它的目的是将不同的类注册到一个容器中,然后在需要的时候动态地创建这些类的实例化对象。在C++中,可以定义一个注册器类来完成这个任务。具体实现代码如下:


//定义抽象类接口

class Product {

public:

  virtual void use() = 0;

  virtual ~Product(){};

};

//定义具体类

class ProductA : public Product {

public:

  void use() override

    //do something for ProductA

  

};

class ProductB : public Product {

public:

  void use() override

    //do something for ProductB

  

};

//定义注册器类

class Factory {

public:

  static Factory* getInstance()

    static Factory instance;

    return &instance;

  

  void registerProduct(const std::string& name, std::function<std::unique_ptr<Product>()> f) {

    m_Map.emplace(name, f);

  }

  std::unique_ptr<Product> createProduct(const std::string& name) {

    auto it = m_Map.find(name);

    if (it != m_Map.end()) {

      auto f = it->second;

      return f();

    }

    return nullptr;

  }

private:

  Factory() = default;

  std::unordered_map<std::string, std::function<std::unique_ptr<Product>()>> m_Map;

};

//注册类到注册器中

int main() {

  Factory::getInstance()->registerProduct("A", []() { return std::make_unique<ProductA>(); });

  Factory::getInstance()->registerProduct("B", []() { return std::make_unique<ProductB>(); });

  auto pa = Factory::getInstance()->createProduct("A");

  auto pb = Factory::getInstance()->createProduct("B");

  return 0;

}

上述代码中,定义了一个抽象类Product和两个具体类ProductA和ProductB,分别实现了use()方法。然后定义了一个注册器类Factory,它有两个方法:registerProduct()来将类注册到注册器中,createProduct()方法来通过类名动态地创建实例化对象。在main函数中,通过调用Factory::getInstance()->registerProduct()方法将具体类ProductA和ProductB注册到注册器中,然后通过Factory::getInstance()->createProduct()方法创建对象并使用。

综上所述,工厂模式和注册器模式在C++中的实现方法不同,可以根据不同的需求选择合适的模式来实现。在实际开发中,工厂模式和注册器模式都有广泛的应用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复