В нашем последнем блоге мы узнали о гамма-категоризации, и в нем говорится, что у нас есть 3 основные категории: «Творческие», «Структурные» и «Поведенческие». В этом блоге мы обсудим первый важный шаблон в разделе «Творческие », то есть «Шаблон построителя.

Почему шаблон Builder?

Иногда создать объект очень просто; вам просто нужно вызвать один конструктор, чтобы добиться этого, но иногда вам нужно учитывать некоторые особые случаи, когда вы должны быть очень внимательны к созданию объекта, иначе это приведет к ошибке по незнанию. Давайте используем пример, чтобы лучше понять это. Допустим, вы хотите создать абзац, используя длинную строку, но вы не можете просто использовать конструктор класса строки, потому что это будет очень сложно поддерживать. Вместо этого вы должны попробовать использовать класс StringBuilder, который позволяет нам создавать строку, добавляя более короткие фрагменты к уже существующей.

Кроме того, наличие большого количества параметров конструктора может быть проблематичным, поскольку люди могут запутаться или сделать ошибки при передаче такого количества параметров в один конструктор. Вместо этого мы должны дать пользователям возможность создавать объекты по частям, что и делает шаблон Builder. Он предлагает пользователям лучший поэлементный подход или API, чтобы они могли создавать объекты без каких-либо проблем.

Давайте рассмотрим пример и попробуем понять, какую проблему решает для нас паттерн Builder.

using System.Text;

namespace DesignPatterns.BadBuilderPattern
{
    public class BuilderPattern
    {
        public static void Main(string[] args)
        {
            Dictionary<string, string> map = new Dictionary<string, string>
            {
               {"user","admin" }, {"email","[email protected]" }
            };

            var sb = new StringBuilder();
            sb.AppendLine("{");
            foreach (var item in map)
            {
                sb.Append("\t{").AppendFormat("0:1"), item.Key, item.Value AppendLine("},");
            }
            sb.AppendLine("}");

            Console.WriteLine(sb);
        }
    }
}

Как видите, здесь мы пытаемся создать объект JSON из словаря, но мы уже используем код C#, который подходит для небольших случаев использования, но что, если позже нам понадобится создать большие объекты? В этом сценарии нам нужно какое-то надежное решение для создания объекта JSON, и нам нужен какой-то «JsonBuilder», чтобы удалить дублирование в коде и предоставить API, с помощью которого мы можем создавать сложные объекты JSON.

namespace DesignPatterns.GoodBuilderPattern
{
    using System.Text;

    public class JsonRoot
    {
        private string _name = string.Empty;
        public List<JsonPair> Children = new List<JsonPair>();

        public JsonRoot(string Name)
        {
            _name = Name;
        }

        public string AsString()
        {
            var sb = new StringBuilder();
            sb.AppendLine("{");
            sb.AppendFormat("\t{0}: ", _name). AppendLine("{");

            foreach (var c in Children)
            {
                sb.Append("\t\t{");
                sb.AppendFormat(" {0} : {1} ", c.Key, c.Value).Append(" },"). AppendLine();
            }

            sb.AppendLine("\t}");
            sb.AppendLine("}");

            return sb.ToString();
        }
    }

    public class JsonPair
    {
        public string Key = string.Empty;
        public string Value = string.Empty;
    }

    public class JsonBuilder
    {
        private JsonRoot _root;
        private string _rootName;

        public JsonBuilder(string RootName)
        {
            _rootName = RootName;
            _root = new JsonRoot(RootName);
        }

        public JsonBuilder AddKeyValuePair(string Key, string Value)
        {
            _root.Children.Add(new JsonPair
            {
                Key = Key,
                Value = Value
            }
            );
            return this;
        }

        public JsonBuilder Clear()
        {
            _root = new JsonRoot(_rootName);
            return this;
        }

        public string PrintJson()
        {
            return _root.AsString();
        }
    }

    public class BuilderPattern
    {
        public static void Main(string[] args)
        {
            var jb = new JsonBuilder("entries");
            jb.AddKeyValuePair("user", "admin");
            jb.AddKeyValuePair("email", "[email protected]");
            jb.AddKeyValuePair("hobbies", "['dancing', 'singing']");

            Console.WriteLine(jb.PrintJson());
        }
    }
}

Как видите, теперь у нас есть надежный класс JsonBuilder, который позволяет нам создавать объекты JSON любого типа.

Мы закончили со "строителями"?

Не совсем. Есть несколько соображений, которые мы должны принять во внимание при реализации шаблона построителя, некоторые из которых будут рассмотрены в следующих блогах. Кроме того, есть несколько способов создания строителей, поэтому мы также рассмотрим их, так что следите за обновлениями!

В заключение я скажу, что шаблон Builder имеет решающее значение, поскольку он позволяет нам предоставлять значимые API-интерфейсы, заключая в себе существующую функциональность. Он также используется в C#, потому что, как мы все знаем, класс StringBuilder в C# использует шаблон Builder для создания строк без выделения памяти каждый раз, что повышает производительность.

Удачного кодирования…!!!