本文へスキップ
BecomeCoder

C#デザインパターンコース · 第1章 デザインパターン · レッスン2

生成②:Builder

ブラウザで完結

導入

引数が多く・省略可能な複雑なオブジェクトを、コンストラクタ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です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。