克隆智能指针vs抽象工厂
Cloning smart pointer vs abstract factory
我需要获得一些抽象类型的新实例,我想到的两件事是抽象工厂和克隆智能指针。哪一个看起来更好?工厂方法似乎更通用,但过于冗长,特别是当抽象对象嵌套时。克隆指针更紧凑,但看起来有点难看,因为我们需要创建一个"虚拟"对象作为模板来创建其他对象。
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);
}
更简单的方法是您没有提供的选项。向基本对象添加一个虚拟的clone
函数,并使用它来克隆对象。
我不太明白你提供的两种方法如何解决同一个问题…指针方法很难正确使用,智能指针必须执行魔术来跟踪内部存储的真正类型,以便能够克隆(将魔术视为类型擦除)。如上所示的工厂要求您知道要克隆的类型
相关文章:
- 派生类是否可以在抽象工厂设计模式中具有数据成员
- 抽象工厂结构的差异
- 下面抽象工厂设计模式的实现是正确的吗
- 工厂方法模式使用继承而抽象工厂模式使用组合如何
- 使用空基类强制继承抽象工厂的做法是不好的吗?
- 具有抽象工厂的派生类的 C++11 单例
- 抽象工厂改进
- 为工厂创建一个抽象工厂是否有意义
- 抽象工厂模式客户端代码
- C++抽象工厂是否应该为构造对象提供销毁方法
- 链接自注册的抽象工厂
- 抽象工厂的多重继承
- 在C++中实现抽象工厂 PIMPL 习语的运行时错误
- 克隆智能指针vs抽象工厂
- 抽象工厂类中的细微设计错误
- 使用抽象工厂和模板元编程的可扩展架构
- 带有参数化构造函数的抽象工厂
- 抽象工厂设计模式在c++中的应用
- 模板类困境的抽象工厂
- 这是哪种设计模式:工厂方法还是抽象工厂