Site icon imageTomoMemo.dev

Memo on programming. Provided by Tomo with passion.

Pythonで学ぶデザインパターン[Factory Method]

Icon in a callout block
Python 100Days Challenge Day19

ファクトリーメソッドは、オブジェクト(プログラムの中で使う道具やデータのかたまり)を作るための特別な方法。

この方法を使うと、どうやってそのオブジェクトを作るかを決めることができる。

ファクトリーメソッドのメリット

  • 簡単に新しい種類のオブジェクトを追加できる
    • 既存コードをあまり変更せずに済む
  • コードが読みやすくなる
    • オブジェクトを作る部分を1つにまとめるので、どこで何をしているかがわかりやすくなる

では、「ケーキを作る」というプログラムを書く例で解説してみる。

ファクトリーメソッドを使わない書き方

もしファクトリーメソッドを使わずケーキを作る場合はこう書ける。

class Cake:
    def __init__(self, type):
    self.type = type
    
cake1 = Cake("チョコレートケーキ")
cake2 = Cake("チーズケーキ")

確かにケーキは作れるけど、新しい種類のケーキを作るには毎回ケーキの作り方を変更する必要が出てくる。

ファクトリーメソッドを使う書き方

ファクトリーメソッドを使うとケーキの作り方は柔軟に変えられる。

class CakeFactory:
    def create_cake(self, type):
        if type == "チョコレートケーキ":
            return ChocolateCake()
        elif type == "チーズケーキ":
            return CheeseCake()
        else:
            return None

class ChocolateCake:
    def __init__(self):
        self.type = "チョコレートケーキ"

class CheeseCake:
    def __init__(self):
        self.type = "チーズケーキ"

factory = CakeFactory()
cake1 = factory.create_cake("チョコレートケーキ")
cake2 = factory.create_cake("チーズケーキ")

こう書くとケーキを作る方法create_cake(self, type):class CakeFactoryにまとめることができる。

単一責任の原則

ファクトリーメソッドを使う理由は関数が1つのタスクにだけ集中するようにするため

  • 例えば、ケーキを作る関数はケーキを作ることだけをすべき
  • オブジェクトを作る(ケーキを作る)ことはとても複雑なので、この部分は別の関数にわけておくと便利

関心分離の原則

プログラムの分かりやすさを保つため

  • もしオブジェクトを作るのにたくさんのコードが必要だとしても、オブジェクトを使う側(例えば、ケーキを食べる側)はその複雑さを知らなくていい
  • オブジェクトを使う側は、オブジェクトをどうやって作るかではなく、何ができるかに集中すべき

Powered by Tomo with passion.