/// /// Classe Builder astratta che si occupa di assemblare l'oggetto /// public abstract class Abstract$Product$Builder { protected $Product$ $Product$ = new(); /// /// Costruttore /// protected Abstract$Product$Builder() { } /// /// Crea una nuova istanza di /// public void CreateNew$Product$() { $Product$ = new $Product$(); } /// /// Costruisco una parte dell'oggetto. /// public abstract void BuildPartA(); /// /// Costruisco una seconda parte dell'oggetto /// public abstract void BuildPartB(); /// /// Costruisco un'ultima parte dell'oggetto /// public abstract void BuildPartC(); /// /// Questo metodo fornisce l'oggetto costruito. /// public $Product$ Get$Product$() { var result = $Product$; // Opzionalmente posso già creare un nuovo oggetto da costruire: // CreateNew$Product$(); return result; } } /// /// Costruisce e assembla le parti del prodotto implementando l'interfaccia /// public class Concrete$Product$Builder : Abstract$Product$Builder { public override void BuildPartA() { $Product$.Add("Standard PartA1"); } public override void BuildPartB() { $Product$.Add("Standard PartB1"); } public override void BuildPartC() { $Product$.Add("Standard PartC1"); } } /// /// Costruisce e assembla le parti del prodotto implementando l'interfaccia /// public class Custom$Product$Builder : Abstract$Product$Builder { public override void BuildPartA() { $Product$.Add("Custom PartA1"); } public override void BuildPartB() { $Product$.Add("Custom PartB1"); } public override void BuildPartC() { $Product$.Add("Custom PartC1"); } } /// /// Oggetto complesso che voglio creare /// public class $Product$ { // example, edit me private readonly IList _parts = new List(); public void Add(string part) { // example, edit me _parts.Add(part); } public string ListParts() { // example, edit me return $"$Product$ parts: {string.Join(", ", _parts)}"; } } /// /// Costruisce un oggetto utilizzando l'interfaccia /// public class $Product$Director { /// /// Costruttore: imposta il iniziale /// public $Product$Director(Abstract$Product$Builder builder) { Builder = builder; } /// /// Builder impostabile dall'esterno. Obbligo il passaggio anche a costruttore in quanto è obbligatorio avere almeno un /// builder impostato /// public Abstract$Product$Builder Builder { get; set; } /// /// Delega al builder la costruione di un nuovo , in questo caso creando tutte le parti /// public void BuildFullFeatured$Product$() { Builder.CreateNew$Product$(); Builder.BuildPartA(); Builder.BuildPartB(); Builder.BuildPartC(); } /// /// Delega al builder la costruione di un nuovo ma creando solo la parte A /// public void BuildMinimalViable$Product$() { Builder.CreateNew$Product$(); Builder.BuildPartA(); } /// /// Fornisce il costruito al Client /// public $Product$ Get$Product$() { return Builder.Get$Product$(); } } // var director = new $Product$Director(new Concrete$Product$Builder()); // director.BuildMinimalViable$Product$(); // Console.WriteLine(director.Get$Product$().ListParts()); // director.BuildFullFeatured$Product$(); // Console.WriteLine(director.Get$Product$().ListParts());