問題一覧に戻る
上級高度なパターン
問題103: ビルダーパターン

ビルダーパターンは複雑なオブジェクトを段階的に構築する設計パターンです。メソッドチェーンで流暢なAPIを提供し、必須・オプショナルフィールドを型安全に扱えます。各メソッドはselfを消費して返すため、不変性を保ちながら状態を更新。build()メソッドで検証を行い、エラーハンドリングも組み込めます。Rustの所有権システムと相性が良いパターンです。

// Userストラクト
#[derive(Debug)]
struct User {
name: String,
email: String,
}

// ビルダーストラクト
struct UserBuilder {
name: Option<String>,
email: Option<String>,
}

impl UserBuilder {
// newメソッド
fn new() -> {
Self { name: None, email: None }
}

// nameメソッド
fn name(mut self, name: &str) -> {
self.name = Some(name.to_string());

}

// emailメソッド
fn email( self, email: &str) -> Self {
self.email = Some(email.());
self
}

// buildメソッド
fn build(self) -> Result<User, &'static str> {
Ok(User {
name: self.name.("Name required")?,
email: self.email.ok_or("Email required")?,
})
}
}

fn main() {
let user = UserBuilder::new()
.name("Alice")
.email("alice@example.com")
.build()
.unwrap();

println!("{:?}", user);
}