0

ある抽象型の新しいインスタンスを取得する必要があります。頭に浮かぶ 2 つのことは、抽象ファクトリとスマート ポインターの複製です。どっちが良く見える?ファクトリ メソッドはより普遍的に見えますが、抽象オブジェクトがネストされている場合は特に、過度に冗長です。クローン ポインターはよりコンパクトですが、他のオブジェクトを作成するためのテンプレートとして使用される「ダミー」オブジェクトを作成する必要があるため、少し見苦しく見えます。

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

クローン ポインター (実装の 1 つ):

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

1 に答える 1