見出し画像

DP.04:メソッドチェイン風のBuilderパターン。-fluent builder-【Python】

【1】fluent builder概要

fluent builderは、「メソッドチェイン風にメソッドをつないでいき、オブジェクトを生成させる」書き方。

■イメージ

# メソッドを後ろにつないでいく書き方
my_computer = Computer.ComputerBuilder().configure_memory(32).configure_gpu('GTX3080').configure_ssd(512).build()

【2】例:PC購入時のスペックカスタマイズ(前回の例)

前回の例:PCのスペックカスタマイズを使ってfluent builderを実装してみる。

■今回のオブジェクト生成のさせ方

my_computer = Computer.ComputerBuilder() \
                       .configure_memory(32) \
                       .configure_gpu('GTX3080') \
                       .configure_ssd(512) \
                       .build()   

fluent builderを利用した今回のオブジェクト生成では、上記のような感じで生成したいオブジェクトの後ろに対応するbuilderオブジェクトとそのメソッドをつないでいく。
そして最後にbuild()をコールして、builderオブジェクト内で作成したオブジェクトを返すようにする。

画像1

これをふまえてComputerオブジェクトを実装する。

■例:fluent builderに対応したComputerオブジェクト

class Computer:

   # initでbuilderを受ける
   def __init__(self, builder):

       # メソッドチェインの最後のbuild()をうけて、オブジェクトに値をセットする
       self.serial = builder.serial
       self.memory = builder.memory
       self.ssd = builder.ssd
       self.gpu = builder.gpu
   
   def __str__(self):
       info = (f'Memory: {self.memory}GB',
               f'SSD: {self.ssd}GB',
               f'Graphics Card: {self.gpu}')
       return '\n'.join(info)
   

   # オブジェクト内にBuilderを持たせる
   class ComputerBuilder:
       def __init__(self):
           self.serial = 'AZ12345678'# Computerオブジェクトをもたせるシリアル(今回は適当に設定)
   
           self.memory = 8 # 適当に初期値を設定
           self.ssd = 128
           self.gpu = None

       # 以下パーツのパラメータ設定
       # return selfでメソッドチェインを実現させる
       def configure_memory(self, amount):
           self.memory = amount
           return self
       
       def configure_ssd(self, amount):
           self.ssd = amount
           return self
       
       def configure_gpu(self, gpu_model):
           self.gpu = gpu_model
           return self
   

       # メソッドチェインの最後にbuild()をコールさせて生成したComputerオブジェクトを返す
       def build(self):
           return Computer(self)
   


画像2

【3】全体コード

# fluent builder

class Computer:

   # initでbuilderを受ける
   def __init__(self, builder):

       # メソッドチェインの最後のbuild()をうけて、オブジェクトに値をセットする
       self.serial = builder.serial
       self.memory = builder.memory
       self.ssd = builder.ssd
       self.gpu = builder.gpu
   
   def __str__(self):
       info = (f'Memory: {self.memory}GB',
               f'SSD: {self.ssd}GB',
               f'Graphics Card: {self.gpu}')
       return '\n'.join(info)
   

   # オブジェクト内にBuilderを持たせる
   class ComputerBuilder:
       def __init__(self):
           self.serial = 'AZ12345678'# Computerオブジェクトをもたせるシリアル(今回は適当に設定)
   
           self.memory = 8
           self.ssd = 128
           self.gpu = None

       # 以下パーツのパラメータ設定
       # return selfでメソッドチェインを実現させる
       def configure_memory(self, amount):
           self.memory = amount
           return self
       
       def configure_ssd(self, amount):
           self.ssd = amount
           return self
       
       def configure_gpu(self, gpu_model):
           self.gpu = gpu_model
           return self
   

       # メソッドチェインの最後にbuild()をコールさせて生成したComputerオブジェクトを返す
       def build(self):
           return Computer(self)

### 動作確認 ###
if __name__ == '__main__':
   

   # バックスラッシュをつけて、エディタ上の改行をいれてみやすくしている(内部処理的には1行相当)
   my_computer = Computer.ComputerBuilder() \
                           .configure_memory(32) \
                           .configure_gpu('GTX3080') \
                           .configure_ssd(512) \
                           .build()

   # 全体を()で囲む、でエディタ上の改行をいれてもOK
   # my_computer = ( 
   #                     Computer.ComputerBuilder() 
   #                         .configure_memory(32) 
   #                         .configure_gpu('GTX3080') 
   #                         .configure_ssd(512).build()
   #                 )


   print(my_computer)

   print("---------")

   # カスタムしない場合の動作
   my_computer2 = Computer.ComputerBuilder().build()
   print(my_computer2)

#実行結果例
Memory: 32GB
SSD: 512GB
Graphics Card: GTX3080
---------
Memory: 8GB
SSD: 128GB
Graphics Card: None

もっと応援したいなと思っていただけた場合、よろしければサポートをおねがいします。いただいたサポートは活動費に使わせていただきます。