🎉 Ура! Після трьох років роботи, я нарешті випустив англійську версію книжки про патерни! Ось вона »

C#: Будівельник

Builder Будівельник Builder

Будівельник — це породжуючий патерн проектування, який дозволяє створювати об’єкти покроково.

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

Детальніше про Будівельника

Особливості паттерна на C#

Складність:

Популярність:

Застосування: Патерн можна часто зустріти в C#-коді, особливо там, де необхідним є покрокове створення продуктів або конфігурація складних об’єктів.

Ознаки застосування патерну: Будівельника можна визначити у класі, який має один створюючий метод та декілька методів налаштування створюваного продукту. Зазвичай, для зручності, методи налаштувань викликають ланцюжком (наприклад, someBuilder->setValueA(1)->setValueB(2)->create()).

Приклад: Структура патерну

Цей приклад показує структуру патерну Будівельник, а саме — з яких класів він складається, які ролі ці класи виконують і як вони взаємодіють один з одним.

Program.cs: Приклад структури патерну

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RefactoringGuru.DesignPatterns.Builder.Structural
{
    class Program
    {
        static void Main(string[] args)
        {
            Builder builder = new ConcreteBuilder();
            Director director = new Director(builder);

            Client client = new Client();
            client.ClientCode(director, builder);
        }
    }

    public class Client
    {
        public void ClientCode(Director director, Builder builder)
        {
            Console.WriteLine("Standart basic product:");
            director.buildMinimalViableProduct();
            Console.WriteLine(builder.GetProduct().ListParts());

            Console.WriteLine("Standart full featured product:");
            director.buildFullFeaturedProduct();
            Console.WriteLine(builder.GetProduct().ListParts());

            Console.WriteLine("Custom product:");
            builder.BuildPartA();
            builder.BuildPartC();
            Console.WriteLine(builder.GetProduct().ListParts());
        }
    }

    public class Director
    {
        Builder builder;

        public Director(Builder builder)
        {
            this.builder = builder;
        }

        public void buildMinimalViableProduct()
        {
            builder.BuildPartA();
        }
		
        public void buildFullFeaturedProduct()
        {
            builder.BuildPartA();
            builder.BuildPartB();
            builder.BuildPartC();
        }
    }

    public abstract class Builder
    {
        public abstract void BuildPartA();
		
        public abstract void BuildPartB();
		
        public abstract void BuildPartC();
		
        public abstract Product GetProduct();
    }

    public class Product
    {
        List<object> parts = new List<object>();
		
        public void Add(string part)
        {
            parts.Add(part);
        }
		
        public string ListParts()
        {
            string str = string.Empty;

            for (int i = 0; i < parts.Count; i++)
            {
                str += parts[i] + ", ";
            }

            str = str.Remove(str.Length - 2); // removing last ",c"

            return "Product parts: " + str + "\n";
        }
    }

    public class ConcreteBuilder : Builder
    {
        Product product = new Product();
		
        public override void BuildPartA()
        {
            product.Add("PartA1");
        }
		
        public override void BuildPartB()
        {
            product.Add("PartB1");
        }
		
        public override void BuildPartC()
        {
            product.Add("PartC1");
        }
		
        public override Product GetProduct()
        {
            Product result = product;

            this.Reset();

            return result;
        }
		
        public void Reset()
        {
            product = new Product();
        }
    }
}

Output.txt: Результат виконання

Standart basic product:
Product parts: PartA1

Standart full featured product:
Product parts: PartA1, PartB1, PartC1

Custom product:
Product parts: PartA1, PartC1