本文へスキップ
BecomeCoder

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

生成③:Prototype

ブラウザで完結

導入

Prototypeは「既存のオブジェクトを複製して新しいものを作る」パターンです。生成コストが高い・設定済みの状態をベースに少し変えたい、といった場面で使います。C#のrecordwith式がこの考え方を自然に表現します。

図解

flowchart LR
    O["原型(設定済み)"] -->|複製 Clone / with| C1["コピー1(一部変更)"]
    O -->|複製| C2["コピー2(一部変更)"]

サンプル

// record は with 式で「一部だけ変えた複製」を作れる=Prototypeの実装
var baseConfig = new Config("localhost", 8080, false);

var prodConfig = baseConfig with { Host = "example.com", UseHttps = true };

Console.WriteLine(baseConfig);   // Config { Host = localhost, Port = 8080, UseHttps = False }
Console.WriteLine(prodConfig);   // Config { Host = example.com, Port = 8080, UseHttps = True }

record Config(string Host, int Port, bool UseHttps);
  • Prototypeは「原型を複製して新しいインスタンスを得る」
  • recordwith式で「一部だけ変えたコピー」を安全に作れる
  • 元のオブジェクトは不変のまま、派生を量産できる

演習

var template = new Character("勇者", 100, 10);

// TODO: with 式で HP だけ 50 に変えた複製 wounded を作り、出力してください
___
  • 期待される出力: Character { Name = 勇者, Hp = 50, Attack = 10 }
ヒント1を見る

var wounded = template with { Hp = 50 };

ヒント2を見る

使用コードの後ろにrecord Character(string Name, int Hp, int Attack);を書きます

まとめ

  • Prototypeは既存インスタンスを複製して作る
  • recordwithが自然な実装
  • 設定済みの状態をベースに派生を作れる

次回: 唯一のインスタンスを保証するSingletonです。

実際に動かしてみよう

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

C# — ブラウザ内で実行

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