Просто добавьте новый общий метод CreateModel
к вашему ModelFac
классу (я предполагаю, что тип ModelFacPtr
должен быть ModelPtr
для лучшего именования, но это не важно для моегорешение):
class ModelFac : public Singleton<ModelFac> {
public:
...
ModelPtr CreateModelA(bool buy, std::string ccy, const std::string& str) {...}
ModelPtr CreateModelB(bool buy, std::string useful_ccy) {...}
ModelPtr CreateModel(Creator& creator) { return creator.Create(); }
};
Вот интерфейс Creator
(конечно, вы должны объявить его перед классом ModelFac
):
class Creator {
public:
virtual ModelPtr Create() = 0;
};
Каждый раз, когда у вас есть новыйтип модели для создания, скажем, модель C
, просто напишите новый Creator
класс:
class CCreator : public Creator {
public:
CCreator(bool buy, std::string foo, int bar)
: m_buy(buy), m_foo(foo), m_bar(bar) {}
ModelPtr Create() {
// use m_buy, m_foo, and m_bar to create and return the model
}
private:
bool m_buy;
std::string m_foo;
int m_bar;
};
Теперь, чтобы создать модель C
, напишите:
ModelFac::Instance().CreateModel( CCreator(true, "haha", 777) );
Как видите, класс ModelFac
не изменяется каждый раз, когда у вас появляется новый тип Model
.Вам нужно написать новый Creator
класс.