/* Строитель
Разделяет создание сложного объекта
и его инициализацию так, что одинаковый
процесс построения может может создавать
объекты с разным состоянием
*/
class Program
{
static void Main()
{
#region Пример №1 - базовое
var rx = new Baker();
var bread = rx.Bake(new RBuilderBread());
Console.WriteLine(bread.ToString());
Console.ReadKey();
#endregion
}
}
///
/// Мука
///
class Floor
{
///
/// Сорт муки
///
public string Sort { get; set; }
}
///
/// Соль
///
class Salt
{
///
/// Масса
///
public double Mass { get; set; }
}
///
/// Пищевые добавки
///
class Additives
{
///
/// Список пищевых добавок
///
public string[] Names { get; set; }
}
///
/// Xлеб
///
class Bread
{
public Floor Floor { get; set; }
public Salt Salt { get; set; }
public Additives Additives { get; set; }
public override string ToString()
{
return $"[F: {Floor.Sort}]---[S: {Salt.Mass}]---[A: {Additives.Names[0]}]";
}
}
///
/// Строитель хлеба
///
abstract class BreadBuilder
{
public Bread Bread { get; set; }
public void CreateBread()
{
Bread = new Bread();
}
public abstract void SetFloor();
public abstract void SetSalt();
public abstract void SetAdditives();
}
///
/// Пекарь
///
class Baker
{
public Bread Bake(BreadBuilder breadBuilder)
{
breadBuilder.CreateBread();
breadBuilder.SetFloor();
breadBuilder.SetSalt();
breadBuilder.SetAdditives();
return breadBuilder.Bread;
}
}
///
/// Для ржаного хлеба строитель
///
class RBuilderBread : BreadBuilder
{
public override void SetAdditives()
{
Bread.Additives = new Additives() { Names = new[] { "E222", "E297" } };
}
public override void SetFloor()
{
Bread.Floor = new Floor() { Sort = "R class" };
}
public override void SetSalt()
{
Bread.Salt = new Salt() { Mass = 3.44 };
}
}