ファクトリメソッドでインスタンス生成をクラス任せにする
連日のRails学習から一旦離れてファクトリメソッドの実装をしてみた
ファクトリメソッドはインスタンス生成をクラスに任せます。ゆえに工場(ファクトリ)メソッドと呼ばれております。 クラス生成を隠蔽するので、結合が疎になってメンテナンス性が向上します。
カレー工場で様々な美味しいカレーを作ります
いろいろなカレーのクラスを作成して、その味わいを表現します。
class BeafCurry def initialize(name) @name = name end def taste puts "この ビーフ#{@name} おいしい" end end
ビーフカレーのクラスです。同じようにマトンカレーのクラスも作成します。
class MuttonCurry def initialize(name) @name = name end def taste puts "この マトン#{@name} おいしい" end end
カレーがビーフカレーだけなら、BeafCurry.new("カレー")とでも書けばいいのですが、マトンカレーもあれば、ここでは書いてませんがキチンカレーもキーマカレーもあります。いつ生産するかわかりませんので、いちいちHogeCurry.newするとなるとキリがありません。 そういったキリのない処理をファクトリに渡して楽をしましょう。
カレーファクトリを生成し、ビーフカレーを生成するBeafCurryFactoryを生成します。
class CurryFactory def initialize @ruu = ruu("カレー") end def review @ruu end end class BeafCurryFactory < CurryFactory def ruu(name) BeafCurry.new(name) end end
CurryFactoryは、ruu()の処理を抽象化しています。 ruuは”カレー”という文字情報をBeafCurryに渡しています。 BeafCurryFactoryのreviewメソッドを使うことで、BeafCurryクラスのtasteメソッドを呼び出すことができます。結果、「この Hogeカレー おいしい」というメッセージを表示させることができました。
factory = BeafCurryFactory.new puts factory.review.taste factory = MuttonCurryFactory.new puts factory.review.taste #=>この ビーフカレー おいしい #=>この マトンカレー おいしい
以上です。 これで他の種類のカレーを作る際には、新しいクラスを生成しさえすればいくらでも量産できるようになりました。