Object Oriented Programming Patterns for Geeks

The Builder Pattern

I must admit that I am not  the biggest fan of this pattern when used in isolation. 

namespace ooppatterns
{
    using System;
    using System.Collections.Generic;

    internal class Program
    {
        private static void Main( string[] args )
        {
            Machine mnfctr = new Machine();

            IBuilder b1 = new ProductABCBuilder();
            mnfctr.Construct( b1 );
            Product p1 = b1.FinishedProduct;
            p1.Parts();

            IBuilder b2 = new ProductXYZBuilder();
            mnfctr.Construct( b2 );
            Product p2 = b2.FinishedProduct;
            p2.Parts();

            Console.ReadLine();
        }
    }

    class Machine
    {
        public void Construct( IBuilder builder )
        {
            builder.BuildPart1();
            builder.BuildPart2();
            builder.BuildPart3();
        }
    }

    interface IBuilder
    {
        void BuildPart1();
        void BuildPart2();
        void BuildPart3();

        Product FinishedProduct { get; }
    }

    class ProductABCBuilder : IBuilder
    {
        private Product product = new Product();

        public void BuildPart1()
        {
            product.Add( "PartA" );
        }

        public void BuildPart2()
        {
            product.Add( "PartB" );
        }

        public void BuildPart3()
        {
            product.Add( "PartC" );
        }

        public Product FinishedProduct
        {
            get { return product; }
        }
    }

    class ProductXYZBuilder : IBuilder
    {
        private Product product = new Product();

        public void BuildPart1()
        {
            product.Add( "PartX" );
        }

        public void BuildPart2()
        {
            product.Add( "PartY" );
        }

        public void BuildPart3()
        {
            product.Add( "PartZ" );
        }

        public Product FinishedProduct
        {
            get { return product; }
        }
    }

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

        public void Add( string part )
        {
            this._parts.Add( part );
        }

        public void Parts()
        {
            Console.WriteLine( "Product is made of:" );

            foreach ( string part in this._parts )
                Console.WriteLine( part );
        }
    }
}