プログラミング的なSomething

プログラミング的なSomething

ITエンジニア(?)目線で生活・自転車・トレーニング話を綴ります

ファクトリメソッドでインスタンス生成をクラス任せにする

連日の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

#=>この ビーフカレー おいしい
#=>この マトンカレー おいしい

以上です。 これで他の種類のカレーを作る際には、新しいクラスを生成しさえすればいくらでも量産できるようになりました。

参考

ファクトリメソッド Ruby 2.0.0 デザインパターン速攻習得[Factory Method]

RubyでTemplateメソッドパターンとFactoryメソッドパターン