Fluent builder (шаблон проєктування)

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

Fluent builder — твірний шаблон проєктування, який спрощує процес створення об'єктів.

Мотивація[ред. | ред. код]

Спростити процес створення важких об'єктів. Розв'язує проблему перевантажених конструкторів, а також проблему великої кількості аргументів в конструкторах.

Опис[ред. | ред. код]

Нехай дано клас User

public class User
{
    // FIELDS
    private string name;
    private string surname;
    private int age;
    private bool isMarried;

     // CONSTRUCTORS
     public User()
     {
         this.name = string.Empty;
         this.surname = string.Empty;
         this.age = 18;
         this.isMarried = false;
     }

     public User(string name, string surname, int age, bool isMarried)
     {
         this.name = name;
         this.surname = surname;
         this.age = age > 18 ? age : 18;
         this.isMarried = isMarried;
     }
}

Його конструктор приймає чотири аргументи, що вже здається надлишковістю. Крім того кількість полів та аргументів може бути значно більшою, а для полів можуть бути присутні різноманітні перевірки.

Додамо клас, який буде відповідати за побудову нашого об'єкта

public class UserBuilder
        {
            // FIELDS
            private User user;

            // CONSTRUCTORS
            public UserBuilder()
            {
                user = new User();
            }

            // METHODS
            public UserBuilder SetName(string name)
            {
                user.name = name;
                return this;
            }

            public UserBuilder SetSurname(string surname)
            {
                user.surname = surname;
                return this;
            }

            public UserBuilder SetAge(int age)
            {
                user.age = age > 18 ? age : 18;
                return this;
            }

            public UserBuilder SetIsMarried(bool isMerried)
            {
                user.isMarried = isMerried;
                return this;
            }

            // BUILDING
            public User Build()
            {
                return user;
            }
        }

Цей клас вміє лише будувати нашого User'a. Важливо відмітити, що кожний Set метод повертає this, тобто посилання на об'єкт будівельника. Це дозволить нам використати Fluent interface.

User user = new User.UserBuilder()
                .SetName("John")
                .SetSurname("Doe")
                .Build();

Звісно це не є обов'язковою вимогою шаблону.

Переваги та недоліки[ред. | ред. код]

Переваги[ред. | ред. код]

  • спрощує процес створення об'єкта
  • спрощує конструктор об'єкта
  • спрощує код

Недоліки[ред. | ред. код]

  • додає клас будівельник, для складних об'єктів
  • не завжди будівельник має доступ до полів об'єкта. В деяких випадках, аби досягти цього, варто порушити інкапсуляцію, що не завжди є прийнятним рішенням

Зв'язок з іншими патернами[ред. | ред. код]

  • Будівник та Fluent Builder використовують з однаковою метою — боротьба з анти-шаблоном "телескопічний конструктор". Але варто розуміти, що Будівник надає інтерфейс для реалізації алгоритмів побудови складних об'єктів. Користувач працює із об'єктами-спадкоємцями через цей інтерфейс доступу. Fluent Builder надає користувачеві методи ініціалізації полів.

Реалізація[ред. | ред. код]

C#[ред. | ред. код]

Див.також[ред. | ред. код]

Джерела[ред. | ред. код]