Перейти к содержанию

Builder.cs

Код подключён напрямую из исходного файла в кодировке UTF-8, поэтому эта страница всегда показывает его актуальную версию.

← К конспекту Скачать исходный файл

Builder.cs
using System;
using System.Collections.Generic;

namespace DesignPatterns.Creational.Builder
{
    // Продукт - сложный неизменяемый объект со множеством опциональных частей
    public sealed class Report
    {
        public string Title { get; }
        public IReadOnlyList<string> Sections { get; }
        public bool HasSummary { get; }

        public Report(string title, IReadOnlyList<string> sections, bool hasSummary)
        {
            Title = title;
            Sections = sections;
            HasSummary = hasSummary;
        }

        public override string ToString() =>
            $"Отчёт «{Title}», разделов: {Sections.Count}, есть резюме: {HasSummary}";
    }

    // Строитель с fluent-интерфейсом: каждый метод возвращает this,
    // что позволяет собирать объект цепочкой вызовов.
    public sealed class ReportBuilder
    {
        private string _title = "Без названия";
        private readonly List<string> _sections = new();
        private bool _hasSummary;

        public ReportBuilder WithTitle(string title)
        {
            _title = title;
            return this;
        }

        public ReportBuilder AddSection(string section)
        {
            _sections.Add(section);
            return this;
        }

        public ReportBuilder WithSummary()
        {
            _hasSummary = true;
            return this;
        }

        // Финальный шаг - собираем неизменяемый продукт из накопленного состояния.
        public Report Build() => new(_title, _sections.AsReadOnly(), _hasSummary);
    }

    public static class Demo
    {
        public static void Run()
        {
            Report report = new ReportBuilder()
                .WithTitle("Продажи за квартал")
                .AddSection("Выручка по регионам")
                .AddSection("Топ-10 клиентов")
                .WithSummary()
                .Build();

            Console.WriteLine(report);
        }
    }
}