Fluent Builder Example

CSharp · Console

/Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
					
public class Program
{
	public static void Main()
	{
		var salesOrder = SalesOrderBuilder
			.Start()
			.WithCustomerName("Jacob Cunningham")
			.WithCustomerPhoneNumber("28155555")
			.WithCustomerEmailAddress("[email protected]")
			.WithCustomerShippingAddress("123 Awesome Rd. Houston, TX 77084")
			.WithLineItems(new List<string> { "Headphones", "Gym Tank" })
			.ShouldWrapAsGift(true)
			.Finish();
		
		DisplaySalesOrder(salesOrder);
		
	}
	
	public static void DisplaySalesOrder(SalesOrder salesOrder)
	{
		Console.WriteLine("Sales Order");
		Console.WriteLine("--------------------");
		Console.WriteLine("Customer Name: {0}", salesOrder.CustomerName);
		Console.WriteLine("Customer Phone Number: {0}", salesOrder.CustomerPhoneNumber);
		Console.WriteLine("Customer Email Address: {0}", salesOrder.CustomerEmailAddress);
		Console.WriteLine("Customer Shipping Address: {0}", salesOrder.CustomerShippingAddress);
		for(var i = 0; i < salesOrder.LineItems.Count(); i++) 
		{
			Console.WriteLine("Line Item #{0}: {1}", i+1, salesOrder.LineItems.ElementAt(i));
		}
			
		Console.WriteLine("Wrap as gift: {0}", salesOrder.WrapAsGift ? "Yes" : "No");
	}
}

public class SalesOrder
{
	public SalesOrder()
	{
		LineItems = new List<string>();
	}
	
	public string CustomerName { get; set; }
	public string CustomerPhoneNumber { get; set; }
	public string CustomerEmailAddress { get; set; }
	public string CustomerShippingAddress { get; set; }
	public IEnumerable<string> LineItems { get; set; }
	public bool WrapAsGift { get; set; }
}

public interface ICustomerName
{
	ICustomerPhoneNumber WithCustomerName(string name);
}

public interface ICustomerPhoneNumber
{
	ICustomerEmailAddress WithCustomerPhoneNumber(string phoneNumber);
}

public interface ICustomerEmailAddress
{
	ICustomerShippingAddress WithCustomerEmailAddress(string emailAddress);
}

public interface ICustomerShippingAddress
{
	ISalesOrderLineItems WithCustomerShippingAddress(string address);
}

public interface ISalesOrderLineItems
{
	ISalesOrderOptionalValues WithLineItems(IEnumerable<string> lineItems);
}

public interface ISalesOrderOptionalValues
{
	ISalesOrderOptionalValues ShouldWrapAsGift(bool wrap);
	SalesOrder Finish();
}

public class SalesOrderBuilder :
	ICustomerName,
ICustomerPhoneNumber,
ICustomerEmailAddress,
ICustomerShippingAddress,
ISalesOrderLineItems,
ISalesOrderOptionalValues
{
	private string _customerName;
	private string _customerPhoneNumber;
	private string _customerEmailAddress;
	private string _customerShippingAddress;
	private IEnumerable<string> _salesOrderLineItems;
	private bool _wrap;
	
	private SalesOrderBuilder()
	{
		_wrap = false;
	}
	
	public static ICustomerName Start()
	{
		return new SalesOrderBuilder();
	}
	
	public ICustomerPhoneNumber WithCustomerName(string name)
	{
		_customerName = name;
		return this;
	}
	
	public ICustomerEmailAddress WithCustomerPhoneNumber(string phoneNumber)
	{
		_customerPhoneNumber = phoneNumber;
		return this;
	}
	
	public ICustomerShippingAddress WithCustomerEmailAddress(string emailAddress)
	{
		_customerEmailAddress = emailAddress;
		return this;
	}
	
	public ISalesOrderLineItems WithCustomerShippingAddress(string address)
	{
		_customerShippingAddress = address;
		return this;
	}
	
	public ISalesOrderOptionalValues WithLineItems(IEnumerable<string> lineItems)
	{
		_salesOrderLineItems = lineItems;
		return this;
	}
	
	public ISalesOrderOptionalValues ShouldWrapAsGift(bool wrap)
	{
		_wrap = wrap;
		return this;
	}
	
	public SalesOrder Finish()
	{
		return new SalesOrder
		{
			CustomerName = _customerName,
			CustomerPhoneNumber = _customerPhoneNumber,
			CustomerEmailAddress = _customerEmailAddress,
			CustomerShippingAddress = _customerShippingAddress,
			LineItems = _salesOrderLineItems,
			WrapAsGift = _wrap
		};
	}
}
;