Code in C#:
namespace Builder_DesignPattern { using System; // These two classes could be part of a framework, // which we will call DP // =============================================== class Director { public void Construct(AbstractBuilder abstractBuilder) { abstractBuilder.BuildPartA(); if (1==1 ) //represents some local decision inside director { abstractBuilder.BuildPartB(); } abstractBuilder.BuildPartC(); } } abstract class AbstractBuilder { abstract public void BuildPartA(); abstract public void BuildPartB(); abstract public void BuildPartC(); } // These two classes could be part of an application // ================================================= class ConcreteBuilder : AbstractBuilder { override public void BuildPartA() { // Create some object here known to ConcreteBuilder Console.WriteLine("ConcreteBuilder.BuildPartA called"); } override public void BuildPartB() { // Create some object here known to ConcreteBuilder Console.WriteLine("ConcreteBuilder.BuildPartB called"); } override public void BuildPartC() { // Create some object here known to ConcreteBuilder Console.WriteLine("ConcreteBuilder.BuildPartC called"); } } ///<summary> /// Summary description for Client. ///</summary> public class Client { public static int Main(string[] args) { ConcreteBuilder concreteBuilder = new ConcreteBuilder(); Director director = new Director(); director.Construct(concreteBuilder); return 0; } } } Code in SOME: CDirector Construct(AAbstractBuilder) AAbstractBuilder a_BuildPartA() a_BuildPartB() a_BuildPartC() CConcreteBuilder: AAbstractBuilder o_BuildPartA() o_BuildPartB() o_BuildPartC() CClient main CClient.main { CConcreteBuilder concreteBuilder.(); CDirector director.(); director.Construct(concreteBuilder) { concreteBuilder.BuildPartA<CConcreteBuilder>() { <% /*("CConcreteBuilder.BuildPartA called")*/ %> }; concreteBuilder.BuildPartB<CConcreteBuilder>() { <% /*("CConcreteBuilder.BuildPartA called")*/ %> }; concreteBuilder.BuildPartC<CConcreteBuilder>() { <% /*("CConcreteBuilder.BuildPartA called")*/ %> }; }; }