У меня есть фабрика, которая строит объекты с самым длинным временем жизни в моем приложении. Они имеют типы, скажем, ClientA
и ClientB
, которые зависят от Provider
(абстрактный класс с множеством возможных реализаций), поэтому оба клиента имеют ссылку на Provider в качестве члена.
Согласно аргументам командной строки, фабрика выбирает одну реализацию Provider
, создает ее (с "new
") и передает ее конструкторам обоих клиентов.
Фабрика возвращает объект, который представляет все мое приложение. Моя основная функция в основном такова:
int main(int argc, char** argv)
{
AppFactory factory(argc, argv);
App app = factory.buildApp();
return app.run();
}
И метод buildApp
в основном такой:
App AppFactory::buildApp()
{
Provider* provider = NULL;
if (some condition)
{
provider = new ProviderX();
}
else
{
provider = new ProviderY();
}
ClientA clientA(*provider);
ClientB clientB(*provider);
App app(clientA, clientB);
return app;
}
Итак, когда выполнение заканчивается, вызываются деструкторы всех объектов, кроме объекта-провайдера (потому что он был создан с помощью "new
").
Как я могу улучшить этот дизайн, чтобы убедиться, что деструктор провайдера называется?
РЕДАКТИРОВАТЬ: Чтобы уточнить, я намерен, чтобы и клиенты, провайдер и объект приложения совместно использовать один и тот же срок службы. После всех ответов я думаю, что и клиенты, и поставщик должны быть распределены в куче, ссылки на которую переданы объекту App, который будет отвечать за их удаление, когда он умирает. Что ты скажешь?