using System.Collections.Generic;
namespace RefactoringGuru.DesignPatterns.Builder.Conceptual
public interface IBuilder
public class ConcreteBuilder : IBuilder
private Product _product = new Product();
this._product = new Product();
this._product.Add("PartA1");
this._product.Add("PartB1");
this._product.Add("PartC1");
public Product GetProduct()
Product result = this._product;
private List<object> _parts = new List<object>();
public void Add(string part)
public string ListParts()
string str = string.Empty;
for (int i = 0; i < this._parts.Count; i++)
str += this._parts[i] + ", ";
str = str.Remove(str.Length - 2);
return "Product parts: " + str + "\n";
private IBuilder _builder;
set { _builder = value; }
public void BuildMinimalViableProduct()
this._builder.BuildPartA();
public void BuildFullFeaturedProduct()
this._builder.BuildPartA();
this._builder.BuildPartB();
this._builder.BuildPartC();
static void Main(string[] args)
var director = new Director();
var builder = new ConcreteBuilder();
director.Builder = builder;
Console.WriteLine("Standard basic product:");
director.BuildMinimalViableProduct();
Console.WriteLine(builder.GetProduct().ListParts());
Console.WriteLine("Standard full featured product:");
director.BuildFullFeaturedProduct();
Console.WriteLine(builder.GetProduct().ListParts());
Console.WriteLine("Custom product:");
Console.Write(builder.GetProduct().ListParts());