![見出し画像](https://assets.st-note.com/production/uploads/images/51958128/rectangle_large_type_2_6af670fce4b28a1e7b896aec00280ee0.png?width=1200)
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](https://assets.st-note.com/production/uploads/images/51955772/picture_pc_cebb6989b43f8fdf19c3835698de8360.png?width=1200)
これをふまえて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](https://assets.st-note.com/production/uploads/images/51957458/picture_pc_ecace96f8df856f956dc01fe18e8a568.png?width=1200)
【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
もっと応援したいなと思っていただけた場合、よろしければサポートをおねがいします。いただいたサポートは活動費に使わせていただきます。