Клонирование умного указателя против абстрактной фабрики

Мне нужно получить новые экземпляры какого-то абстрактного типа, и мне на ум приходят две вещи: абстрактная фабрика и клонирование умного указателя. Какой из них выглядит лучше? Фабричный метод кажется более универсальным, но слишком многословным, особенно когда абстрактные объекты вложены. Указатель клонирования более компактен, но кажется немного уродливым, потому что нам нужно создать «фиктивный» объект, используемый в качестве шаблона для создания других объектов.

class IObject {
public:
virtual ~IObject() {}
};

class Foo: public IObject {
public:
struct Config {};
explicit Foo(const Config& config): config_(config) {}

private:
Config config_;
};

Абстрактная фабрика:

class IObjectFactory {
public:
virtual ~IObjectFactory() {}
virtual std::unique_ptr<IObject> Create() const = 0;
};

class FooFactory: public IObjectFactory {
public:
explicit FooFactory(const Foo::Config& config): config_(config) {}

std::unique_ptr<IObject> Create() const {
return std::unique_ptr<IObject>(new Foo(config_));
}

private:
Foo::Config config_;
};

void DoSomething(const std::shared_ptr<IObjectFactory>& factory) {
std::vector<std::shared_ptr<IObject>> objects;
for (int i = 0; i < 10; ++i) {
objects.push_back(factory->Create());
}
// Do something with the created objects
}

int main() {
auto factory = std::make_shared<FooFactory>(Foo::Config());
DoSomething(factory);
}

Указатель клона (одна из реализаций):

template <typename T> class clone_ptr; // deep cloning smart pointer

void DoSomething(const clone_ptr<IObject>& object) {
std::vector<clone_ptr<IObject>> objects;
for (int i = 0; i < 10; ++i) {
objects.push_back(object);
}
// Do something with the created objects
}

int main() {
clone_ptr<IObject> object(new Foo(Foo::Config()));
DoSomething(object);
}

0

Решение

Более простая вещь — это то, что вы не предоставили в качестве опции. Добавить виртуальный clone функция к базовому объекту и использовать его для клонирования объектов.

Я не совсем понимаю, как два подхода, которые вы предложили, решают одну и ту же проблему … подход указателя сложен, чтобы правильно, умный указатель должен сделать магия отследить, какой реальный тип хранится внутри, чтобы иметь возможность клонировать магия как стирание типа). Завод, как показано выше, требует, чтобы вы знали тип, который вы хотите клон.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector