3

私は比較的新しい C++ プログラマーです。
いくつかのコードを書く際に、以下のコードと概念的に似たものを作成しました。友人がこれは実際には工場のパターンであると指摘したとき、私はそのパターンについて読んで、それが似ているのを見ました。

私が見つけたすべての例で、ファクトリ パターンはclass BaseFactory{...};静的create()メンバー関数を使用して実装したのではなく、常に などの別のクラスを使用して実装されていることがわかりました。

私の質問は次のとおりです。
(1)これは実際に工場のパターンですか?
(2) コードは機能しているようです。私が実装した方法に何か間違っていますか?
(3)私の実装が正しい場合、別のクラスcreate()とは対照的に静的関数を実装することの長所/短所は何ですか.BaseFactory

ありがとう!

class Base {
    ...
    virtual ~Base() {}
    static Base* create(bool type);
}

class Derived0 : public Base {
    ...
};

class Derived1 : public Base {
    ...
};

Base* Base::create(bool type) {
    if(type == 0) {
        return new Derived0();
    }
    else {
        return new Derived1();
    }
}

void foo(bool type) {
    Base* pBase = Base::create(type);
    pBase->doSomething();
}
4

2 に答える 2

3

これは、ファクトリ パターンを実装する一般的な方法ではありません。主な理由は、ファクトリ クラスは通常、それが作成するクラスのベースではないためです。継承を使用する場合の一般的なガイドラインは、「公開継承モデルが "is-a" であることを確認する」です。あなたの場合、これはDerived0or型のオブジェクトも typeDerived1である必要がBaseあり、派生クラスは Base よりも専門的な概念を表す必要があることを意味します。

ただし、ファクトリ パターンにはほとんど常に継承が含まれます。これは、ファクトリが基本型へのポインタを返すためです (これも同様です)。これは、ファクトリが作成したオブジェクトのタイプをクライアント コードが知る必要がなく、基本クラスのインターフェイスと一致することだけを意味します。

静的作成関数を持つことに関しては、状況によって異なります。例が示すように、1 つの利点は、使用するためにファクトリのインスタンスを作成する必要がないことです。

于 2013-10-01T20:26:31.853 に答える
1

ファクトリとインターフェイスをマージしてSRPの原則を破ったという事実を除けば、ファクトリは問題ありません。

基本クラスで create static メソッドを作成する代わりに、別の (ファクトリ) クラスで作成します。

于 2013-10-01T20:21:54.247 に答える