【问题标题】:Cloning smart pointer vs abstract factory克隆智能指针与抽象工厂
【发布时间】:2013-06-20 11:02:08
【问题描述】:

我需要获取一些抽象类型的新实例,我想到的两件事是抽象工厂和克隆智能指针。哪个更好看?工厂方法似乎更通用,但过于冗长,尤其是当抽象对象嵌套时。克隆指针更紧凑,但看起来有点难看,因为我们需要创建一个“虚拟”对象用作模板来创建其他对象。

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);
}

克隆指针(one of the implementations):

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);
}

【问题讨论】:

    标签: c++ design-patterns architecture clone factory


    【解决方案1】:

    更简单的做法是您没有提供的选项。将虚拟 clone 函数添加到您的基础对象并使用它来克隆对象。

    我不太明白您提供的两种方法如何解决相同的问题...指针方法很难正确处理,智能指针必须执行 magic 来跟踪哪个是存储在内部以便能够克隆的真实类型(将 magic 视为 type erasure)。如上所示的工厂要求您知道要克隆的类型。

    【讨论】:

      猜你喜欢
      • 2010-11-29
      • 1970-01-01
      • 2014-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2021-07-03
      • 2019-05-16
      相关资源
      最近更新 更多