導入
引数が多く・省略可能な複雑なオブジェクトを、コンストラクタ1つで作るのは大変です。Builderは生成手順を段階的なメソッド呼び出しに分け、読みやすく組み立てます。
図解
flowchart LR
B["Builder"] -->|AddPatty| B
B -->|AddCheese| B
B -->|AddSauce| B
B -->|Build| R["完成した Burger"]
サンプル
// メソッドチェーンで段階的に組み立てる
var burger = new BurgerBuilder()
.AddPatty()
.AddCheese()
.AddSauce("テリヤキ")
.Build();
Console.WriteLine(burger); // バーガー[パティ, チーズ, テリヤキソース]
class BurgerBuilder
{
private readonly List<string> _items = new();
public BurgerBuilder AddPatty() { _items.Add("パティ"); return this; }
public BurgerBuilder AddCheese() { _items.Add("チーズ"); return this; }
public BurgerBuilder AddSauce(string name) { _items.Add($"{name}ソース"); return this; }
public string Build() => $"バーガー[{string.Join(", ", _items)}]";
}
- 各手順メソッドが
this(自分自身)を返すことでメソッドチェーンになる - 必要な部品だけを好きな順で足せる(省略可能な要素に強い)
- 最後に
Build()で完成品を得る
演習
var pc = new PcBuilder().Cpu("i7").Ram(16).Build();
Console.WriteLine(pc); // PC[CPU=i7, RAM=16GB]
// TODO: Cpu(string) と Ram(int) を段階的に設定し Build() で "PC[CPU=..., RAM=...GB]" を返す
// PcBuilder を定義してください(各設定メソッドは this を返す)
___
- 期待される出力:
PC[CPU=i7, RAM=16GB]
ヒント1を見る
フィールドに値を保持し、各メソッドでreturn this;
ヒント2を見る
class PcBuilder { string _cpu=""; int _ram; public PcBuilder Cpu(string c){_cpu=c;return this;} public PcBuilder Ram(int r){_ram=r;return this;} public string Build()=>$"PC[CPU={_cpu}, RAM={_ram}GB]"; }
まとめ
- Builderは複雑な生成を段階的なメソッド呼び出しに分ける
thisを返してメソッドチェーンにする- 省略可能な要素が多いオブジェクトの生成に向く
次回: 既存インスタンスを複製するPrototypeです。