using System; class SampleProgram { static void Main(string[] args) { var laptopBuilder = new LaptopBuilder(); Director.Construct(laptopBuilder); var laptop = laptopBuilder.WithHdmi().WithUsb3().Result; Console.WriteLine(laptop.ConstructionDate); } } static class Director { public static void Construct(IBuilder builder) { builder.CreateChassi(); builder.CreateScreen(); builder.ConnectScreenWithChassi(); } } interface IBuilder { void CreateChassi(); void CreateScreen(); void ConnectScreenWithChassi(); } interface IBuilder : IBuilder { T Result { get; } } class LaptopBuilder : IBuilder { Laptop laptop; public LaptopBuilder() { laptop = new Laptop(); } public void CreateChassi() { Console.WriteLine("Chassi created!"); } public void CreateScreen() { Console.WriteLine("Screen created!"); } public void ConnectScreenWithChassi() { Console.WriteLine("Zooooooo... Klack!!"); } public LaptopBuilder WithUsb3() { Console.WriteLine("Integrated (+300 EUR)!"); return this; } public LaptopBuilder WithHdmi() { Console.WriteLine("Integrated (Puh ...)!"); return this; } public Laptop Result { get { return laptop; } } } abstract class Product { } class Laptop : Product { public Laptop() { ConstructionDate = DateTime.Now; } public DateTime ConstructionDate { get; private set; } }