📖

Factory Methodをざっくり理解してみる

に公開

Daily Blogging87日目

デザインパターン難しい
その中の1つであるFactory Methodについてざっくり整理してみる

Factory Methodとは

Factory Methodとは、オブジェクトの生成ロジックをカプセル化したメソッドのこと
工場のように完成品(オブジェクト)を提供することからその名がついてる。

Factory Method(ファクトリー・メソッド)は、生成に関するデザインパターンの一つで、スーパークラスでオブジェクトを作成するためのインターフェースが決まっています。しかし、サブクラスでは作成されるオブジェクトの型を変更することができます。

https://refactoring.guru/ja/design-patterns/factory-method

メリット

オブジェクトの生成ロジックを一箇所にまとめることができて、下記を向上させられる

  • 再利用性
  • 保守性

また、呼び出し側は詳細な生成ロジックを知らなくても、適切なオブジェクトを取得できるという利点もある。

大福工場を例にして考えてみる。

その工場ではいろんな大福を生産してる
いちご大福とかよもぎ大福とか

いちご大福を食べたいユーザがその大福工場に対して「いちご大福をください」と注文すると、
大福工場はその注文を受け取るだけでいちご大福の生産を始める。
いちご大福に必要な材料を用意して、決められた工程を順番にこなしていちご大福が完成。
出来上がった大福をユーザにお届けしてくれます。

この時、ユーザは必要な材料も工程も何も知りませんが、注文方法だけは知ってた。
注文の仕方を知っているだけでいちご大福を手に入れることができる。

コードに落とし込んでみる

こんな感じ

# 大福のスーパークラス
# 大福を作るためのメソッドを持っている
class Daifuku
  def prepare
    raise NotImplementedError, "Subclasses must implement the prepare method"
  end
end

# いちご大福クラス
# 大福クラスを継承することで、大福に関するインターフェースを持つ
class IchigoDaifuku < Daifuku
  def prepare
    # いちご大福の材料集める
    # 材料をもとに必要な工程を順番に実施する
  end
end

# よもぎ大福クラス
# 大福クラスを継承することで、大福に関するインターフェースを持つ
class YomogiDaifuku < Daifuku
  def prepare
    # よもぎ大福の材料集める
    # 材料をもとに必要な工程を順番に実施する
  end
end

# 大福ファクトリーのスーパークラス
class DaifukuFactory
  def create
    daifuku = create_daifuku
    daifuku.prepare
    daifuku
  end

  def create_daifuku
    raise NotImplementedError, "Subclasses must implement the create_daifuku method"
  end
end

# いちご大福ファクトリー
class IchigoDaifukuFactory < DaifukuFactory
  def create_daifuku
    IchigoDaifuku.new
  end
end

# よもぎ大福ファクトリー
class YomogiDaifukuFactory < DaifukuFactory
  def create_daifuku
    YomogiDaifuku.new
  end
end

# ファクトリーメソッドを使って大福を作成
ichigo_factory = IchigoDaifukuFactory.new
ichigo = ichigo_factory.create

いちご大福クラスもよもぎ大福クラスも同じ大福インターフェースを持っているので、
大福ファクトリークラスで同じ呼び出し方ができる

大福を注文するときは、詳細なロジックを知らなくても大福ファクトリークラスに注文するだけで簡単にほしい大福が手に入る

Discussion