- ベストアンサー
テンプレートメソッド
デザインパターンを使わずに書く方法とかって どんな感じなんになるんでしょう? たとえば、うどんをそばを作る場合なんかはほとんど 工程は一緒なのでテンプレートメソッドに使うんだろうけど みなさんならどうやって書きますか? ifとかならわかるんですが、もっとスマートにかけないものですか? 1どんぶり用意(親クラス) 2うどんかそばを入れる←重複するコード(実装を子クラスへ) 3だしをそそぐ(親クラス)
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
まずは、基底となる抽象クラスとインターフェイスを定義しますね。必要となる要素を搾り出し、それらの性質を抽象クラスとして定義しておきます。 ・「麺」抽象クラスを定義 ・「うつわ」抽象クラスを定義 ・「だし」抽象クラスを定義 で、実際の利用には、それぞれのクラスを実装する。 ・「麺」クラスを継承し、「うどん」および「そば」クラスを定義。 ・「うつわ」クラスを継承し、「どんぶり」クラスを定義 ・「だし」クラスを継承し、「関東風だし」クラスを定義 ここまでがクラス類の用意。これらを利用してうどんやそばを作る際には、これらを利用するクラスを書く。例えば、立ち食いそばを作る際には、「立ち食いそば」クラスを定義し、そのコンストラクタに、「そば」、「どんぶり」「関東風だし」のインスタンスをそれぞれ引数として渡すようにしておきます。 new 立ち食いそば(new そば(),new どんぶり(),new 関東風だし()); こんな具合にして、立ち食いそばインスタンスを作るわけですね。 私だったら、だいたいこんな感じで実装するかな、と思います。もっと考えれば、例えば「作成」部分はインターフェイスとして定義しておき、「立ち食いそば」クラスにimplementsして使えるようにしたほうが便利かな? あるいは、インスタンスを生成するためのクラスやメソッドを用意するとか。(デザインパターンでいえばファクトリーというやつです) 要するに、要素を部品として分解し、汎用性を持たせる。そして抽象部分を抽出してそれを元に全体の実装を定義するようにする、という感じでしょうか。そう考えると、これは「デザインパターン」の考え方とさほど違いはないかも知れません。 デザインパターンというのは、なにか特殊な手法があるわけじゃなくて、多くの人があれこれ試行錯誤した末に「こうするのが一番いいんじゃないかな」とたどり着いたものがパターン化されたものですから。どんなことであれ、突き詰めれば、いずれはそこにたどり着くんじゃないでしょうか。
その他の回答 (2)
もしかして、Strategyパターンを理解していないのですか?
補足
出張で返事が遅くなりすみません! Strategyパターンはまだ勉強してません。。 今理解してるのは、以下の5個です。 Adaptor State Facade Template Command デザインパターンの本は手元にありますので一度読んで確認してみます。
TemplateMethodパターンの代替としては、Strategyパターンを使います。 継承を使うTemplateMethodより、委譲によるStrategyパターンのほうが好ましいです。
補足
丁寧な回答ありがとうございます。 とても参考になります! ・「麺」クラスを継承し、「うどん」および「そば」クラスを定義。 ・「うつわ」クラスを継承し、「どんぶり」クラスを定義 ・「だし」クラスを継承し、「関東風だし」クラスを定義 上記のように継承してクラスを作る意味ある(他にも処理が異なる)場合は、そうすると思うのですが。 下記のような「Selectmen」以外は処理が同じであった場合、テンプレートメソッド使って書くと以下のような書き方(抜けはあるかもしれませんが)になると思います。JavaのところにC++でコードを書くのはいかがなものかと思いますが・・それはお許しを。。 このような場合にテンプレートメソッドを使わないとなると 派生クラスを作る意味がないような気がして。 ですが、基本クラスでif”うどん”or ”そば”って分けるのはあまりに単純で。。 それ以外の方法でなにかないかと考えたのですが、あまりいいのが思いつかなかったために質問してみました。 class 麺 { protected: virtual void Selectmen()=0; // 麺を入れる 抽象メソッド public: 昼食を作る() { どんぶりを用意する Selectmen(); だしを入れる } } class そば : public 麺 { void Selectmen() { そばをどんぶりにいれる } } class うどん : public 麺 { void Selectmen() { うどんをどんぶりにいれる } }