///
/// 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());