Bob Budowniczy
Wszystkie wcześniej wymienione problemy da się rozwiązać, stosując wzorzec budowniczego.
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);
}
}
}
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ć.
var address = new Address.Builder()
.AddressLine1("Konwaliowa 31/20")
.ZipCode("20036")
.City("Lublin")
.StateArea("Lubelskie")
.Build();
Kopiowanie obiektu też jest znacznie czytelniejsze:
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();
Jedna odpowiedź do “Niezmienny obiekt i budowniczy”