Builder Pattern β ΡΡΠΎ ΠΏΠΎΡΠΎΠΆΠ΄Π°ΡΡΠΈΠΉ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΡΠΎΡ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΠΎΠ»Π΅Π·Π΅Π½, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅Π»Π°ΡΡ Π΅Π³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΡΠΌ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠΌ.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΠΈ
- Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΠΈΠ»Π΄Π΅Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΎΡΠ΄Π΅Π»ΠΈΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΎΡ Π΅Π³ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΡΡΡΠΊΡΡΡΡ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΡΡΠΌ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΌ.
- ΠΠΎΡΠ°Π³ΠΎΠ²Π°Ρ ΡΠ±ΠΎΡΠΊΠ°. ΠΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΈ ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
- ΠΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΡ. ΠΠ°ΡΡΠ΅ΡΠ½ Π±ΠΈΠ»Π΄Π΅Ρ ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΅Π³ΠΎ Π½Π΅Π»ΡΠ·Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ, ΡΡΠΎ ΡΠ»ΡΡΡΠ°Π΅Ρ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΡΡΡ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ.
ΠΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ
Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Car
, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ, ΡΠ°ΠΊΠΈΡ
ΠΊΠ°ΠΊ ΡΠΈΠΏ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ, ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π΄Π²Π΅ΡΠ΅ΠΉ, ΡΠ²Π΅Ρ ΠΈ Ρ.Π΄.
ΠΠ΅Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Β«ΠΠΈΠ»Π΄Π΅ΡΒ» ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΡΠΎΠ»ΠΊΠ½ΡΡΡΡΡ Ρ ΡΠ°ΠΊΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ: Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ, ΡΡΠΎ ΡΡ ΡΠ΄ΡΠ°Π΅Ρ ΡΠΈΡΠ°Π΅ΠΌΠΎΡΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΊΠΎΠ΄Π°. ΠΠ°ΡΡΠ΅ΡΠ½ Β«ΠΠΈΠ»Π΄Π΅ΡΒ» ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΡΠΎΠ³ΠΎ, ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ fluent API ΡΡΠΈΠ»Ρ β ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠ΅ΡΠΎΠ΄Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°ΡΡ ΡΠ°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΠΈΠ»Π΄Π΅ΡΠ°, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ Π²ΡΠ·ΡΠ²Π°ΡΡ ΠΈΡ ΡΠ΅ΠΏΠΎΡΠΊΠΎΠΉ. ΠΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π²ΡΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΈ Π»Π΅Π³ΠΊΠΈΠΌ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ.
public class Car {
private String engine;
private int doors;
private String color;
private Car(CarBuilder builder) {
this.engine = builder.engine;
this.doors = builder.doors;
this.color = builder.color;
}
public static class CarBuilder {
private String engine;
private int doors;
private String color;
public CarBuilder setEngine(String engine) {
this.engine = engine;
return this;
}
public CarBuilder setDoors(int doors) {
this.doors = doors;
return this;
}
public CarBuilder setColor(String color) {
this.color = color;
return this;
}
public Car build() {
return new Car(this);
}
}
}
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°:
Car car = new Car.CarBuilder()
.setEngine("V8")
.setDoors(4)
.setColor("Red")
.build();
System.out.println(car);
ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π°
- Π§ΠΈΡΡΡΠΉ ΠΊΠΎΠ΄. ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΡΠ½ΠΎΠΉ ΠΈ ΠΏΠΎΠ½ΡΡΠ½ΠΎΠΉ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
- ΠΠΈΠ±ΠΊΠΎΡΡΡ Π² ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ². ΠΠΎΠΆΠ½ΠΎ Π½Π΅ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΠ°Π·Ρ, Π° Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΈΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΡΠΎ Π΄Π΅Π»Π°Π΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΠΈΠΌΠΌΡΡΠ°Π±Π΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΠ±ΡΠ΅ΠΊΡΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅ ΡΠ±ΠΎΡΠΊΠΈ.
- ΠΠΈΠ½ΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΎΠΊ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ². ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
ΠΠ΅Π΄ΠΎΡΡΠ°ΡΠΊΠΈ
- Π£ΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠ°-Π±ΠΈΠ»Π΄Π΅ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΡΠ²Π΅Π»ΠΈΡΠΈΡΡ ΠΎΠ±ΡΠ΅ΠΌ ΠΊΠΎΠ΄Π°, ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ Π΅ΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ Π½Π΅ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠΆΠ΅Π½, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ°Π²Π΄Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°.
- ΠΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΡΡΡ. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΡΠ΅Π±ΡΠ΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π±ΠΈΠ»Π΄Π΅ΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΊΠ°Π·Π°ΡΡΡΡ ΠΈΠ·Π»ΠΈΡΠ½ΠΈΠΌ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½Π΅Π½ΡΠΆΠ½ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠ»ΠΎΠ²Π½ΠΎΡΡΡ.
ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ?
- ΠΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΉ ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
- ΠΠΎΠ³Π΄Π° Π½ΡΠΆΠ΅Π½ Π³ΠΈΠ±ΠΊΠΈΠΉ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΡ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ².
- ΠΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌ, ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΠ±ΠΎΡΠΊΠΈ Π΅Π³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΌΠ΅Π½ΡΡΡΡΡ.
ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠΉ Π±ΠΈΠ»Π΄Π΅Ρ
ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ
ΠΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΡΡΡΡΡΠ²ΠΈΠ΅ ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΈΡ Π½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π±ΠΈΠ»Π΄Π΅ΡΠ°. ΠΡΠ»ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΈΠΌΠ΅Π΅Ρ ΠΏΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Ρ Π΄Π»Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΈΠ»ΠΈ ΠΈΠΌΡ), Π½ΠΎ ΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π½Π΅ ΠΊΠΎΠ½ΡΡΠΎΠ»ΠΈΡΡΠ΅ΡΡΡ Π±ΠΈΠ»Π΄Π΅ΡΠΎΠΌ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΡΡ ΠΈΠ»ΠΈ Π½Π΅Π²Π°Π»ΠΈΠ΄Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ².
Π Π΅ΡΠ΅Π½ΠΈΠ΅:
- ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π±ΠΈΠ»Π΄Π΅ΡΠ°, ΡΡΠΎΠ±Ρ ΠΈΡ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π±ΡΠ»ΠΎ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ. ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°ΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ΅ΠΏΠΎΡΠΊΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ².
ΠΡΠΈΠΌΠ΅Ρ:
public class Car {
private final String engine; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private final String model; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private int doors; // ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private String color; // ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
// ΠΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° ΡΠ΅ΡΠ΅Π· Π±ΠΈΠ»Π΄Π΅Ρ
private Car(CarBuilder builder) {
this.engine = builder.engine;
this.model = builder.model;
this.doors = builder.doors;
this.color = builder.color;
}
// Π‘ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π±ΠΈΠ»Π΄Π΅ΡΠ° Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ
public static CarBuilder builder(String engine, String model) {
return new CarBuilder(engine, model);
}
public static class CarBuilder {
private final String engine; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private final String model; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private int doors = 4; // ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
private String color = "Black"; // ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ
// ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π±ΠΈΠ»Π΄Π΅ΡΠ° Ρ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΠΎΠ»ΡΠΌΠΈ
public CarBuilder(String engine, String model) {
if (engine == null || engine.isEmpty()) {
throw new IllegalArgumentException("Engine is required");
}
if (model == null || model.isEmpty()) {
throw new IllegalArgumentException("Model is required");
}
this.engine = engine;
this.model = model;
}
// ΠΠ΅ΡΠΎΠ΄Ρ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΠΎΠ»Π΅ΠΉ
public CarBuilder setDoors(int doors) {
this.doors = doors;
return this;
}
public CarBuilder setColor(String color) {
this.color = color;
return this;
}
// ΠΠ΅ΡΠΎΠ΄ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Car
public Car build() {
return new Car(this);
}
}
}
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ ΠΏΡΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠΈ Π±ΠΈΠ»Π΄Π΅ΡΠ°:
Car car = Car.builder("V8", "Sedan") // ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΡ
ΠΏΠΎΠ»Π΅ΠΉ ΡΠ΅ΡΠ΅Π· ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠ΅ΡΠΎΠ΄
.setDoors(2) // ΠΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ
.setColor("Red")
.build();
ΠΠ°Π»ΠΈΠ΄Π°ΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°
ΠΡΡ ΠΎΠ΄Π½Π° ΡΠ°ΡΡΠ°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΈΡ Π½Π΅ ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π½Π° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ ΠΏΠΎΠ»Π΅ΠΉ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°ΠΌΠΈ, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
Π Π΅ΡΠ΅Π½ΠΈΠ΅:
ΠΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ Π² Π±ΠΈΠ»Π΄Π΅Ρ Π»ΠΎΠ³ΠΈΠΊΡ Π²Π°Π»ΠΈΠ΄Π°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠ΅ΡΠ΅Π΄ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΡΠ±Π΅Π΄ΠΈΡΡΡΡ, ΡΡΠΎ Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΡ ΠΈ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΡΡΠ΅ΠΊΡΠ΅Π½.
ΠΡΠΈΠΌΠ΅Ρ:
public Car build() {
if (doors < 2 || doors > 6) {
throw new IllegalArgumentException("Invalid number of doors");
}
return new Car(this);
}
ΠΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ²
ΠΠΎΠ³Π΄Π° ΠΌΠ΅ΡΠΎΠ΄Ρ Π±ΠΈΠ»Π΄Π΅ΡΠ° Π²ΡΠ·ΡΠ²Π°ΡΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΠΊΠ°ΠΆΠ΄ΡΠΉ Π²ΡΠ·ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΡΠ°ΡΡΡΡ Π½Π΅Π·Π°ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ ΠΈΠ»ΠΈ Π²ΡΠ·Π²Π°ΡΡ Π½Π΅ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅.
ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Ρ Π½Π°Ρ Π΅ΡΡΡ Π±ΠΈΠ»Π΄Π΅Ρ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ° Car
, ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π»Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄Π²Π΅ΡΠ΅ΠΉ (setDoors
) Π±ΡΠ» Π²ΡΠ·Π²Π°Π½ Π΄Π²Π°ΠΆΠ΄Ρ:
Car car = new Car.CarBuilder("V8")
.setDoors(4)
.setDoors(2) // ΠΡΠΎΡ Π²ΡΠ·ΠΎΠ² ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠ΅Ρ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅
.setColor("Red")
.build();
Π ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡ car Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ Ρ Π΄Π²ΡΠΌΡ Π΄Π²Π΅ΡΡΠΌΠΈ, Ρ ΠΎΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡ ΠΌΠΎΠ³ ΠΎΠΆΠΈΠ΄Π°ΡΡ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ 4 Π΄Π²Π΅ΡΠΈ (ΠΈΠ·-Π·Π° ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π°). Π’Π°ΠΊΠ°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΡΠ°ΡΠΏΡΠΎΡΡΡΠ°Π½Π΅Π½Π°, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΠ΅ΠΊΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΡΠ΅ΡΡΡ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈ, ΠΈΠ»ΠΈ ΠΊΠΎΠ³Π΄Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π±ΠΈΠ»Π΄Π΅ΡΠΎΠΌ, Π½Π΅ Π·Π½Π°Ρ Π²ΡΠ΅Ρ Π΄Π΅ΡΠ°Π»Π΅ΠΉ.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ Π½Π° ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ². Π§ΡΠΎΠ±Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΡΡ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈ ΡΠΎΠ³ΠΎ ΠΆΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π°, ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π»ΠΎΠ³ΠΈΠΊΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ, Π±ΡΠ» Π»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ ΡΠΆΠ΅ Π²ΡΠ·Π²Π°Π½ ΡΠ°Π½Π΅Π΅. ΠΡΠ»ΠΈ ΠΌΠ΅ΡΠΎΠ΄ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΠ±ΡΠΎΡΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΠΉ Π²ΡΠ·ΠΎΠ².
public static class CarBuilder {
private String engine;
private int doors;
private String color;
private boolean doorsSet = false; // Π€Π»Π°Π³, ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ setDoors ΡΠΆΠ΅ Π±ΡΠ» Π²ΡΠ·Π²Π°Π½
public CarBuilder(String engine) {
this.engine = engine;
}
public CarBuilder setDoors(int doors) {
if (doorsSet) {
throw new IllegalStateException("Doors can only be set once");
}
this.doors = doors;
doorsSet = true;
return this;
}
public CarBuilder setColor(String color) {
this.color = color;
return this;
}
public Car build() {
return new Car(this);
}
}
ΠΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². ΠΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡΠ°ΡΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ², Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π²Π°ΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ², ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅, ΡΡΠΎΠ±Ρ Π±ΡΠ»ΠΎ Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½ΠΎΠ²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ.
public CarBuilder setDoors(int doors) {
if (this.doors != 0) {
System.out.println("Warning: Doors value is being overwritten from " + this.doors + " to " + doors);
}
this.doors = doors;
return this;
}
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Fluent API Step building. ΠΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
public class Car {
private final String engine; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private final int doors; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
private final String color; // ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎΠ»Π΅
// ΠΡΠΈΠ²Π°ΡΠ½ΡΠΉ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΡ ΡΠ±ΠΎΡΠΊΡ
private Car(String engine, int doors, String color) {
this.engine = engine;
this.doors = doors;
this.color = color;
}
// ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°Π³Π°: Π²ΡΠ±ΠΎΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π»Ρ
public interface EngineStep {
DoorsStep setEngine(String engine);
}
// ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠ°Π³Π°: Π²ΡΠ±ΠΎΡ Π΄Π²Π΅ΡΠ΅ΠΉ
public interface DoorsStep {
ColorStep setDoors(int doors);
}
// ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΡΠ΅ΡΡΠ΅Π³ΠΎ ΡΠ°Π³Π°: Π²ΡΠ±ΠΎΡ ΡΠ²Π΅ΡΠ°
public interface ColorStep {
BuildStep setColor(String color);
}
// ΠΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ ΡΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π³Π°: Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ±ΠΎΡΠΊΠΈ
public interface BuildStep {
Car build();
}
// ΠΠ»Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΏΠΎΡΠ°Π³ΠΎΠ²ΡΡ ΡΠ±ΠΎΡΠΊΡ
public static class Builder implements EngineStep, DoorsStep, ColorStep, BuildStep {
private String engine;
private int doors;
private String color;
@Override
public DoorsStep setEngine(String engine) {
this.engine = engine;
return this;
}
@Override
public ColorStep setDoors(int doors) {
this.doors = doors;
return this;
}
@Override
public BuildStep setColor(String color) {
this.color = color;
return this;
}
@Override
public Car build() {
return new Car(engine, doors, color);
}
}
// ΠΠ΅ΡΠΎΠ΄ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΠΎΡΠ°Π³ΠΎΠ²ΠΎΠΉ ΡΠ±ΠΎΡΠΊΠΈ
public static EngineStep builder() {
return new Builder();
}
}
ΠΠ΅ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ
ΠΠ±Π»Π°ΡΡΡ:: 00 Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ°
Π ΠΎΠ΄ΠΈΡΠ΅Π»Ρ:: ΠΠΎΡΠΎΠΆΠ΄Π°ΡΡΠΈΠΉ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ
ΠΡΡΠΎΡΠ½ΠΈΠΊ::
Π‘ΠΎΠ·Π΄Π°Π½Π°:: 2024-10-04
ΠΠ²ΡΠΎΡ::