На основании вашего описания я бы порекомендовал Абстрактную Фабрику, переданную в конструктор.
class ClassFactory {
public:
virtual ~ClassFactory
virtual Class1 * createClass1(...) = 0; // obviously these are real params not varargs
virtual Class2 * createClass2(...) = 0;
};
class DefaultClassFactory : public ClassFactory {
// ....
};
Container::Container(
some params,
boost::smart_ptr<ClassFactory> factory = boost::smart_ptr<ClassFactory>(new DefaultClassFactory))
{
class1.reset(factory->createClass1(...));
class2.reset(factory->createClass1(...));
}
Это форма внедрения зависимости без фреймворка. Обычные клиенты могут использовать DefaultClassFactory
прозрачно, как и раньше. Другие клиенты, например, модульные тесты, могут внедрить свою собственную реализацию ClassFactory
.
В зависимости от того, как вы хотите контролировать владение параметром factory
, это может быть smart_ptr, scoped_ptr или ссылка. Ссылка может привести к немного более чистому синтаксису.
Container::Container(
some params,
ClassFactory & factory = DefaultClassFactory())
{
class1.reset(factory.createClass1(...));
class2.reset(factory.createClass1(...));
}
void SomeClient()
{
Container c(some params, SpecialClassFactory());
// do special stuff
}