CSharp · Console
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
};
}
}