W Javie i C # można utworzyć obiekt z właściwościami, które można ustawić przy inicjalizacji, poprzez zdefiniowanie konstruktora za pomocą parametrów, zdefiniowanie każdej właściwości po skonstruowaniu obiektu lub użycie wzorca interfejsu konstruktora / płynu. Jednak C # 3 wprowadził inicjatory obiektów i kolekcji, co oznaczało, że wzorzec konstruktora był w dużej mierze bezużyteczny. W języku bez inicjatorów można zaimplementować konstruktor, a następnie użyć go w następujący sposób:
Vehicle v = new Vehicle.Builder()
.manufacturer("Toyota")
.model("Camry")
.year(1997)
.colour(CarColours.Red)
.addSpecialFeature(new Feature.CDPlayer())
.addSpecialFeature(new Feature.SeatWarmer(4))
.build();
I odwrotnie, w języku C # można napisać:
var vehicle = new Vehicle {
Manufacturer = "Toyota",
Model = "Camry",
Year = 1997,
Colour = CarColours.Red,
SpecialFeatures = new List<SpecialFeature> {
new Feature.CDPlayer(),
new Feature.SeatWarmer { Seats = 4 }
}
}
... eliminując potrzebę konstruktora, jak widać w poprzednim przykładzie.
Czy na podstawie tych przykładów konstruktory są nadal przydatne w języku C #, czy też zostały całkowicie zastąpione przez inicjatory?
are builders useful
dlaczego ciągle widzę tego rodzaju pytania? Builder to wzorzec projektowy - na pewno może zostać ujawniony jako funkcja językowa, ale na koniec jest to tylko wzorzec projektowy. Wzorzec projektowy nie może być „zły”. Może, ale nie musi spełnić twojego przypadku użycia, ale to nie czyni całego wzoru błędnym, tylko jego zastosowanie. Pamiętaj, że pod koniec dnia wzorce projektowe rozwiązują określone problemy - jeśli nie napotykasz problemu, to dlaczego miałbyś go rozwiązać?