Niezmienny obiekt i budowniczy

Bob Budowniczy

Wszystkie wcześniej wymienione problemy da się rozwiązać, stosując wzorzec budowniczego.

<code>public class Address 
{
	// poprzednia zawartość klasy adres

	public class Builder 
	{
		private string addressLine1;
		private string addressLine2 = "";
		private string zipCode;
		private string city;
		private string stateArea = "";
		private string country = "Poland";
		
		public Builder()
		{

		}

		public Builder(Address address)
		{
			addressLine1 = address.addressLine1;
			addressLine2 = address.addressLine2;
			zipCode = address.zipCode;
			city = address.city;
			stateArea = address.stateArea;
			country = address.country;
		}

		public Builder AddressLine1(string addressLine1)
		{
			this.addressLine1 = addressLine1;
			return this;
		}

		public Builder AddressLine2(string addressLine2)
		{
			this.addressLine2 = addressLine2;
			return this;
		}

		public Builder ZipCode(string zipCode)
		{
			this.zipCode = zipCode;
			return this;
		}

		public Builder City(string city)
		{
			this.city = city;
			return this;
		}

		public Builder StateArea(string stateArea)
		{
			this.stateArea = stateArea;
			return this;
		}

		public Builder Country(string country)
		{
			this.country = country;
			return this;
		}

		public Address Build() 
		{
			return new Address(
				addressLine1,
				addressLine2,
				zipCode,
				city,
				stateArea,
				country);
		}
	}
}</code>

Dodanie budowniczego rozdmuchało klasę Address, z drugiej jednak strony pozwala czytelnie zainicjować jej instancję z pominięciem pól, których nie chcemy ustawiać.

<code>var address = new Address.Builder()
	.AddressLine1("Konwaliowa 31/20")
	.ZipCode("20036")
	.City("Lublin")
	.StateArea("Lubelskie")
	.Build();</code>

Kopiowanie obiektu też jest znacznie czytelniejsze:

<code>var templateAddress = new Address.Builder()
	.AddressLine1("Konwaliowa 31/20")
	.ZipCode("20036")
	.City("Lublin")
	.StateArea("Lubelskie")
	.Build();

var modifedAddress = new Address.Builder(templateAddress)
	.AddressLine1("Konwaliowa 31/21")
	.Build();</code>

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *