Thursday, September 20, 2012

C# Builder Pattern

So I have been learning C# lately and trying to apply some concepts from Joshua Bloch's Effective Java 2.

The builder pattern.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PaymentLibrary
{
    public sealed class CardType
    {
        public string Id { get; private set; }
        public string Name { get; private set; }
        public string IssueFlag { get; private set; }
        public IList<int> Lengths { get; private set; }
        public IList<string> Prefixes { get; private set; }

        private CardType()
        {
        }

        public sealed class Builder
        {
            private string id;
            private string name;
            private string issueFlag;
            private IList<int> lengths = new List<int>();
            private IList<string> prefixes = new List<string>();

            public Builder WithId(string id)
            {
                this.id = id;
                return this;
            }

            public Builder WithName(string name)
            {
                this.name = name;
                return this;
            }

            public Builder WithLength(int length)
            {
                this.lengths.Add(length);
                return this;
            }

            public Builder WithIssueFlag(string issueFlag)
            {
                this.issueFlag = issueFlag;
                return this;
            }

            public Builder WithPrefix(string prefix)
            {
                this.prefixes.Add(prefix);
                return this;
            }

            public CardType Build()
            {
                CardType cardType = new CardType();
                cardType.Id = id;
                cardType.Name = name;
                cardType.IssueFlag = issueFlag;
                cardType.Lengths = lengths;
                cardType.Prefixes = prefixes;
                return cardType;
            }
        }
    }
}

Usage:
CardType cardType = new CardType.Builder()
                                    .WithId("MC")
                                    .WithName("Mastercard")
                                    .WithIssueFlag("N")
                                    .WithPrefix("49")
                                    .WithPrefix("56")
                                    .WithLength(16)
                                    .WithLength(18)
                                    .WithLength(19)
                                    .Build();