ビルダーパターンを実装する方法を説明し、C＃で書かれた例を作成します
Builderパターンは、複雑なオブジェクトを分解して構築するために使われるデザイン・パターンです。このパターンはディレクタとコンストラクタの2つの部分に分かれています。

ディレクタはオブジェクトを構築する順序を定義する役割を担い、コンストラクタは個々のオブジェクトを構築する役割を担います。

C#でBuilderパターンを実装するには、以下の手順に従わなければならない：

オブジェクトの構築に必要なメソッドを定義するIBuilderインターフェースを作成する。

public interface IBuilder
{
    void BuildPartA();
    void BuildPartB();
    void BuildPartC();
    Product GetResult();
}

IBuilder インターフェイスを実装する具象クラスを作成し、オブジェクトを構築します。

public class ConcreteBuilder1 : IBuilder
{
    private Product _product = new Product();

    public void BuildPartA()
    {
        _product.Add("Part A");
    }

    public void BuildPartB()
    {
        _product.Add("Part B");
    }

    public void BuildPartC()
    {
        _product.Add("Part C");
    }

    public Product GetResult()
    {
        return _product;
    }
}

public class ConcreteBuilder2 : IBuilder
{
    private Product _product = new Product();

    public void BuildPartA()
    {
        _product.Add("Part X");
    }

    public void BuildPartB()
    {
        _product.Add("Part Y");
    }

    public void BuildPartC()
    {
        _product.Add("Part Z");
    }

    public Product GetResult()
    {
        return _product;
    }
}

IBuilder オブジェクトを使用してオブジェクトを構築するディレクタ・クラスを作成します。

public class Director
{
    public void Construct(IBuilder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
        builder.BuildPartC();
    }
}

最終的にビルドされたオブジェクトを表す Product クラスを作成します。

public class Product
{
    private List<string> _parts = new List<string>();

    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);

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

最後に、Builderパターンをクライアント・クラスで使用します：

class Client
{
    static void Main(string[] args)
{
Director director = new Director();
IBuilder builder1 = new ConcreteBuilder1();
IBuilder builder2 = new ConcreteBuilder2();

    director.Construct(builder1);
    Product product1 = builder1.GetResult();
    product1.ListParts();

    director.Construct(builder2);
    Product product2 = builder2.GetResult();
    product2.ListParts();

    Console.ReadKey();
}
}

この例では、ConcreteBuilder1とConcreteBuilder2という2つのビルダー・オブジェクトがあり、これらはIBuilderインターフェイスを実装していますが、最終的なオブジェクトの構築方法は異なります。DirectorクラスはIBuilderオブジェクトを使用してオブジェクトを構築し、Productクラスは最終的に構築されるオブジェクトです。コードを実行すると、2つの異なるオブジェクトが同じ構築プロセスで構築されていることがわかります。