最近デザインパターンの勉強をしているのですが、早速疑問がでました。
というのも、AbstructFactoryとFuctoryMethodの違いが分からないんです。
どちらも抽象的な要素を作る物で、具体的に何を作るかは派生クラスに任せる事は理解
したのですが、やってる事は全く同じ気がするのですが・・・
例えば、以下のコード
class IItem {
public:
virtual string GetItemName() const = 0;
};
class Apple : public IItem {
public:
virtual string GetItemName() const { return Apple作った; }
};
class Orange : public IItem {
public:
virtual string GetItemName() const { return Orange作った; }
};
class Factory {
public:
virtual IItem *CreateItem() const = 0; // 生成内容は派生クラスに任せる
};
class AppleFactory : public Factory {
public:
virtual IItem *CreateItem() const { return new Apple; }
};
class OrangeFactory : public Factory {
public:
virtual IItem *CreateItem() const { return new Orange; }
};
int main()
{
Factory *pApple = new AppleFactory;
Factory *pOrange = new OrangeFactory;
IItem *pItem = pApple->CreateItem();
cout << pItem->GetItemName() << endl;
delete pItem;
return 0;
}
これってどっちのパターンになるのでしょうか・・・?
こういったパターンと言うのは、クラス図的な構造だけでなくて
実際にそのクラスを利用する側の利用の仕方まで含むと思います。
ですから、例に挙げているのはどちらのパターンにも該当しないのではないかと
思います。
こういったファクトリパターンの良い所はマクロな視点で見たときには
同じ流れで処理が出来るのだけれど、細かい部分で実装が異なる場合に
異なる実装部分をいかに実装クラスに追い出し、抽象クラスを使用する部分を
フレームワーク化してデザインするかにかかっていると思います。
いずれのファクトリパターンも上記の考え方からすれば同じですが、
AbstructFactoryは、よりダイナミックに実装を切り替えたい場合に使用し、
FuctoryMethodは、細かい部分の実装を切り替えたい場合に使用するのでは
ないかと理解しています。
ここにこの辺の説明があるようなので読んで見られてはどうでしょう。
http://www.seto.nanzan-u.ac.jp/~amikio/NISE/member-niit/yamada/integration/menu.
html
よく考えるとC++にはインタフェースの概念が無いので
どちらのパターンであると言う判断は難しいかなと思います。
この手のパターンと言うのはデザインを効率良く行える様にする為の知識だと思うので、
あまり言葉に振り回されなくても良いような気もします。
私的には、Factroyクラスに複数のクラスを生成するようなメソッドが宣言されて
いる場合は、AbstructFactoryに近いと思いますし、単一クラスしか扱わないので
あれば、FuctoryMethodに近いのかなとも思います。
いずれにせよ、大切なのはこういったパターンを知っておくことで
より柔軟性のあるシステムをデザインすることが容易になると言うことだと
思うので言葉の定義に振り回されないようにしてパターンが何を目的にして
いる物なのかをつかむ様にする方がより建設的だと思います。
ありがとうございます。
>この手のパターンと言うのはデザインを効率良く行える様にする為の知識だと思うの
>で、あまり言葉に振り回されなくても良いような気もします。
確かにその通りかもしれません。
私もデザインパターンって「こんな時にこんな風にするとうまくいくよ」っていう感じ
のカタログ的な物と思っておりましたが、実際の現場ではプログラマ同士でパターン名
が出る事があるようなので、定義を把握しておいたほうがいいかな、と思ったのです。
>AbstructFactoryは、よりダイナミックに実装を切り替えたい場合に使用し、
>FuctoryMethodは、細かい部分の実装を切り替えたい場合に使用するのでは
>ないかと理解しています。
こういう風にすみわければいいのかもしれませんね。
おっと、解決忘れました。