Builder Pattern

The Builder pattern is a creational design pattern that allows for the construction of complex objects step by step. It provides a clear and readable way to create objects with many optional parameters or complex initialization logic.

Examples:


#[derive(Debug)]
struct Pizza {
    base: Option<String>,
    sauce: Option<String>,
    toppings: Vec<String>,
    // ... other optional parameters
}

struct PizzaBuilder {
    pizza: Pizza,
}

impl PizzaBuilder {
    fn new() -> Self {
        PizzaBuilder {
            pizza: Pizza {
                base: None,
                sauce: None,
                toppings: Vec::new(),
                // ... initialize other optional parameters
            },
        }
    }

    fn add_base(mut self, base: String) -> Self {
        self.pizza.base = Some(base);
        self
    }

    fn add_sauce(mut self, sauce: String) -> Self {
        self.pizza.sauce = Some(sauce);
        self
    }

    fn add_topping(mut self, topping: String) -> Self {
        self.pizza.toppings.push(topping);
        self
    }

    // ... other setter methods for optional parameters

    fn build(self) -> Option<Pizza> {
        if !self.pizza.base.is_none() && !self.pizza.sauce.is_none() {
            Some(self.pizza)
        } else {
            None
        }
    }

    // OR
    //  fn build(self) -> Pizza {
    //     self.pizza
    // }
}

fn main() {
    let pizza = PizzaBuilder::new()
        .add_base("Thin Crust".to_string())
        .add_sauce("Tomato".to_string())
        .add_topping("Cheese".to_string())
        .add_topping("Mushrooms".to_string())
        .build();

    match pizza {
        Some(pizza) => println!("Successfully built pizza: {:?}", pizza),
        None => println!("Failed to build pizza due to missing parameters"),
    }
}