デザインパターンの一つ、Factory Methodパターンを勉強してみました。
今回はQtとC++を使って、不思議なGUIアプリを作ってみました。
Template Methodパターンを理解してからの方がいいかも?
Factory Methodパターンとは
インスタンスの生成をサブクラスで行うことで、柔軟にインスタンスの生成をすることができます。
もっと言えば、このパターンを使用することで、クラスの再利用性を高めることができます。
クラス図
Template Methodパターンで解説したたい焼き機の例で説明をしてみます。
Creator | たい焼き機クラス |
Product | たい焼き |
ConcreteCreator | 具象たい焼き機クラス |
ConcreteProduct | 具象たい焼き |
Template Methodパターンでは、たい焼き機クラスが一連のレシピを呼び出してくれて、具象たい焼き機クラスで一連のレシピをオーバーライドしていました。
Factory Methodパターンでは、それにもう少し自由度を与えた感じです。
例えば、全国各地にたい焼き機クラスを継承した具象たい焼き機クラスが点在するとします。
今までのTemplate Methodパターンでは、たい焼きを作る最初の大事な工程はたい焼き機クラスで定義されていました。
しかし、この重要な最初の工程を責任をもって自分の店舗でやりたい!という店舗がでてきました。
そうなったとき、この生地の作成を各具象たい焼き機クラスで決定していいよ、ということができるようになったのが、Factory Methodパターンです。
うーん、、我ながら分かりづらい・・。
つまり何が言いたいかというと、一番大事なインスタンス作成をサブクラスに任せるパターンなんですよね。
作成したアプリ
Template Methodパターンで作成したアプリで、スープを入れる器をサブクラスで作成できるようにしました。
コードと実行結果
左のうさぎから、以下のようなテーブルとなっています。
うさぎ | 猫 | クマ | |
肉 | 大豆ミート | さかな | 鹿肉 |
野菜 | にんじん | わかめ | キャベツ |
スープストック | コンソメ | あごだし | はちみつ |
器 | お皿 | ミルクパン | お皿 |
器の行が追加されました。Cat
クラスでは、インスタンス作成をサブクラスで担当し、うさぎとクマはスーパークラスで担当しています。
コードを分解
では、各クラスの説明をしていきます。Template Methodパターンとほとんど一緒なので、差分だけ紹介します。
cook.h / cook.cpp
クラス図でいうCreatorクラスの役割をします。
createBowl
関数で、インスタンス生成を担当します。
cat.h / cat.cpp
クラス図でいう、ConcreteCreatorの役割をします。
createBowl
関数をオーバーライドして、器のインスタンスをMilkPan
クラスで生成しています。
どういう時に使うのか?
使いどきはいまいちあまりしっくりきてません。
Template Methodパターンを使うときに、ふと頭の隅に置いておくといいのかもしれません。
でもFactoryクラスってよく業務で見かける
まとめ
Factory Methodパターンをアプリ作成してまとめてみました。
使いどきは、いまいちしっくりきていませんが、Factoryって業務で何回か見かけたことのあるワードなので、
最低限サブクラスでインスタンス生成を担当するパターンというのを覚えておきたいと思います!
他のデザインパターンについてはこちらをご覧ください。
参考サイト
にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村
コメント