c++ - 比工厂更好的设计模式?

标签 c++ design-patterns

在我现在创建的代码中,我有一个对象可以属于两种离散类型,通过序列号进行区分。像这样的事情:

class Chips {
public:
    Chips(int shelf) {m_nShelf = shelf;}
    Chips(string sSerial) {m_sSerial = sSerial;}
    virtual string GetFlavour() = 0;
    virtual int GetShelf() {return m_nShelf;}
protected:
    string m_sSerial;
    int m_nShelf;
}

class Lays : Chips {
    string GetFlavour() 
    {
        if (m_sSerial[0] == '0') return "Cool ranch";
        else return "";
    }
}

class Pringles : Chips {
    string GetFlavour() 
    {
        if (m_sSerial.find("cool") != -1) return "Cool ranch";
        else return "";
    }
}

现在,实现这一点的明显选择是使用工厂设计模式。手动检查哪个序列属于哪个类类型不会太困难。

但是,这需要有一个知道所有其他类并通过名称引用它们的类,这几乎不是真正通用的,特别是如果我最终不得不添加一大堆子类。

让事情变得更复杂的是,在知道对象的实际序列号之前,我可能必须保留一个对象一段时间,这意味着我可能必须编写充满虚拟函数的基类,而不是保持它抽象并以某种方式替换它当我得到序列号时,使用其中一个子类的实例。这也不太理想。

工厂设计模式真的是解决这个问题的最佳方法吗?还是有人有更好的主意?

最佳答案

您可以创建一个只知道基类的工厂,如下所示:

向基类添加纯虚方法:virtual Chips* clone() const=0; 并为所有派生实现它,就像 operator= 但返回指针到一个新的派生。 (如果你有析构函数,它也应该是虚拟的)

现在您可以定义一个工厂类:

Class ChipsFactory{
  std::map<std::string,Chips*> m_chipsTypes;

public:
  ~ChipsFactory(){
     //delete all pointers... I'm assuming all are dynamically allocated.
     for( std::map<std::string,Chips*>::iterator it = m_chipsTypes.begin();
          it!=m_chipsTypes.end(); it++) {
        delete it->second;
     }
  }
  //use this method to init every type you have
  void AddChipsType(const std::string& serial, Chips* c){
    m_chipsTypes[serial] = c;
  }      
  //use this to generate object
  Chips* CreateObject(const std::string& serial){
    std::map<std::string,Chips*>::iterator it = m_chipsTypes.find(serial);
    if(it == m_chipsTypes.end()){
       return NULL;
    }else{
       return it->clone();
    }   
  }
};

用所有类型初始化工厂,您可以从中获取初始化对象类型的指针。

关于c++ - 比工厂更好的设计模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19925165/

相关文章:

C++ 信号不会在 QML 端被捕获

c++ - 如何将字符串读入 vector

c++ - 在C++中初始化对象数组

python - Decorator/Wrapper增强方法内部调用

flutter - Flutter:我必须为我的应用程序中的每个零件创建一个 block 吗?最佳做法是什么?

c++ - 如何在MFC中的CWnd中显示CFormView?

c++ - 类型转换指向 unique_ptr 的普通指针是一种不好的做法吗?

model-view-controller - MVC WITH Web 应用程序的实际模式是什么?

c++ - Main 函数与状态之间的通信

javascript - 如何在React中结合Material-UI的snackbar和input组件?