У меня есть абстрактный базовый класс вроде этого:
class AbstractBaseClass
{};
шаблонный конкретный класс, производный от него:
template<class T>
class ConcreteClass : public AbstractBaseClass
{
public:
ConcreteClass(T input) : data(input) {}
private:
T data;
};
И у меня есть фабричный класс, который создает AbstractBaseClasses
class MyFactory
{
public:
boost::shared_ptr<AbstractBaseClass> CreateBlah();
boost::shared_ptr<AbstractBaseClass> CreateFoo();
template<class T>
boost::shared_ptr<AbstractBaseClass> Create(T input)
{
return boost::shared_ptr<AbstractBaseClass>(new ConcreteClass<T>(input));
}
};
Проблема в том, что теперь ВСЕ который использует MyFactory, должен включать всю реализацию ConcreteClass. В идеале я хочу, чтобы о ConcreteClass знали только MyFactory.
Есть ли способ спроектировать это для достижения этой цели? (Помимо ручного создания новой функции Create в MyFactory для каждого типа, который мне нужен, вместо его создания по шаблону).