Π ΠΊΠ½ΠΈΠ³Π΅ βHead First. ΠΠ°ΡΡΠ΅ΡΠ½Ρ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡβ Π΄Π°Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ½Π°ΠΌ:
ΠΠ°ΡΡΠ΅ΡΠ½ Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΠ΅ΡΠΎΠ΄ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ±ΠΊΠ»Π°ΡΡΠ°ΠΌ Π²ΡΠ±ΡΠ°ΡΡ ΠΊΠ»Π°ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π΄Π΅Π»Π΅Π³ΠΈΡΡΠ΅Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ° ΡΡΠ±ΠΊΠ»Π°ΡΡΠ°ΠΌ.
ΠΠ°ΡΡΠ΅ΡΠ½ ΠΠ±ΡΡΡΠ°ΠΊΡΠ½Π°Ρ Π€Π°Π±ΡΠΈΠΊΠ° ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ² Π²Π·Π°ΠΈΠΌΠΎΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π±Π΅Π· ΡΠΊΠ°Π·Π°Π½ΠΈΡ ΠΈΡ
ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ
ΠΊΠ»Π°ΡΡΠΎΠ².
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅Ρ ΡΠ°Π·ΠΎΠ±ΡΠ°ΡΡΡΡ Π² ΡΡΠΎΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅. ΠΠΎΠΏΡΡΡΠΈΠΌ ΠΡ ΡΠ΅ΡΠΈΠ»ΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΈΠ³ΡΡ ΠΏΡΠΎ Π»ΡΠ΄Π΅ΠΉ ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅ΡΠ°ΡΡ ΡΡΠ°ΡΡβ¦ (Π½ΡΠΆΠ½ΠΎ ΡΡΠΎ-ΡΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ΅ ΠΈ Π½Π΅ΠΎΠ±ΡΡΠ½ΠΎΠ΅ Π·Π΄Π΅ΡΡ) ΠΌΠΎΠ½Π°Ρ
Π°ΠΌΠΈ.
ΠΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ Π½Π°ΡΠ°ΡΡ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ.
1) ΠΠ°Π²Π΅ΡΡΠΈ ΠΊΠ»Π°ΡΡ ΠΠΎΠ½Π°Ρ
(Monk) ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ (Π΄Π»Ρ Π½Π°ΡΠ°Π»Π° ΠΎΠ΄ΠΈΠ½ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ):
Π·Π²ΡΡΠΈΡ ΠΊΠ°ΠΊ Β«ΡΠ°Π±ΡΠΈΠΊΠ° Π·Π²Π΅Π·Π΄Β»:
public abstract class Monk {
public abstract void description();
}
public class OrthodoxMonk extends Monk {
@Override
public void description() {
System.out.println("Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
");
}
}
2) Π ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ»Π°ΡΡ ΠΠΎΠ½Π°ΡΡΡΡΡ (Monastery), Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π² ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Β«ΠΌΠΎΠ½Π°ΡΠ΅ΡΠΊΠΈΠ΅ ΠΎΠ±Π΅ΡΡΒ»:
public class Monastery {
private Monk monk;
public void createMonk(String typeName) {
this.monk = switch (typeName) {
case "ORTODOX" -> new OrthodoxMonk();
default -> null;
};
}
public Monk getMonk() {
return monk;
}
}
ΠΡ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
public class Main {
public static void main(String[] args) {
Monastery monastery = new Monastery();
monastery.createMonk("ORTODOX");
monastery.getMonk().description();
}
}
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
Π’Π΅ΠΏΠ΅ΡΡ Π΅ΡΠ»ΠΈ ΡΠ°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠΎΠ·Π΄Π°ΡΡβ¦ ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Ρ
Π°, ΡΠΎ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ
Π) Π‘ΠΎΠ·Π΄Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ Π΄Π»Ρ ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Ρ
Π°:
public class CatholicMonk extends Monk {
@Override
public void description() {
System.out.println("Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
");
}
}
Π) ΠΠ½Π΅ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ½Π°ΡΡΡΡΡ:
public class Monastery {
private Monk monk;
public void createMonk(String typeName) {
this.monk = switch (typeName) {
case "ORTODOX" -> new OrthodoxMonk();
case "CATHOLIC" -> new CatholicMonk();
default -> null;
};
}
public Monk getMonk() {
return monk;
}
}
ΠΈ ΡΠ°ΠΊ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ Π²Π½Π΅ΡΠ΅Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΡΠΈΠΏΠΎΠ² ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΈ ΠΏΡΠ°Π²ΠΈΡΡ ΠΈΠΌΠ΅ΡΡΠΈΠΉΡΡ.
Π§ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΡΡΠΎΠ±Ρ ΠΊΠ°ΠΊ-Π»ΠΈΠ±ΠΎ Β«ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΠΈΡΠΎΠ²Π°ΡΡΒ» ΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π½Π°Ρ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ½Π°ΡΡΡΡΡ. ΠΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ ΠΏΠ°ΡΡΠ΅ΡΠ½ Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΠ΅ΡΠΎΠ΄.
ΠΠ°ΠΊ ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π²ΡΠ³Π»ΡΠ΄Π΅ΡΡ
Π) ΠΠ»Π°ΡΡ ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² ΠΎΡΡΠ°Π²ΠΈΠΌ ΠΊΠ°ΠΊ Π΅ΡΡΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ°Π·Π²Π΅ ΡΡΠΎ Π΅ΡΠ΅ Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Ρ
Π° (Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΊΠ°ΡΠΎΠ»ΠΈΠΊΠΎΠ² ΠΈ ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΡ
Π² Ρ
ΡΠΈΡΡΠΈΠ°Π½ΡΡΠ²Π΅ Π΅ΡΡΡ ΠΌΠΎΠ½Π°ΡΠ΅ΡΡΠ²ΠΎ):
public abstract class Monk {
public abstract void description();
}
public class OrthodoxMonk extends Monk {
@Override
public void description() {
System.out.println("Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
");
}
}
public class CatholicMonk extends Monk {
@Override
public void description() {
System.out.println("Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
");
}
}
public class AnglicanMonk extends Monk {
@Override
public void description() {
System.out.println("Π― Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
");
}
}
Π) ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ½Π°ΡΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ (ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π΅Π³ΠΎ ΠΈ Π΅Π³ΠΎ ΠΌΠ΅ΡΠΎΠ΄ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌ). ΠΠ΄Π΅ΡΡ ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄:
public abstract class Monastery {
protected abstract Monk createMonk();
}
ΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ ΠΌΠ΅ΡΠΎΠ΄Π°:
public class OrthodoxMonastery extends Monastery {
@Override
protected Monk createMonk() {
return new OrthodoxMonk();
}
}
public class CatholicMonastery extends Monastery {
@Override
protected Monk createMonk() {
return new CatholicMonk();
}
}
public class AnglicanMonastery extends Monastery {
@Override
protected Monk createMonk() {
return new AnglicanMonk();
}
}
Π) ΠΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΊΠΎΠ΄
public class Main {
public static void main(String[] args) {
Monastery monastery;
monastery = new OrthodoxMonastery();
monastery.createMonk().description();
monastery = new CatholicMonastery();
monastery.createMonk().description();
monastery = new AnglicanMonastery();
monastery.createMonk().description();
}
}
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
Π― Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
Π’.Π΅. ΠΊΠ°ΠΊ ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΡΡ
ΡΠΈΠΏΠΎΠ² ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² Π½Π΅ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΌΠ΅Π½ΡΡΡ ΠΈΠΌΠ΅ΡΡΠΈΠ΅ΡΡ ΠΊΠ»Π°ΡΡΡ, Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ (ΠΊΠ»Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°ΡΡΡΡΡ ΠΈ ΠΌΠΎΠ½Π°Ρ
Π°).
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΊΡΠΎ-ΡΠΎ ΡΠΆΠ΅ Π·Π°ΠΌΠ΅ΡΠΈΠ», ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ description, ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ» Ρ ΡΠ°ΠΌΠΎΠ³ΠΎ Π½Π°ΡΠ°Π»Π° Π² ΠΊΠ»Π°ΡΡΠ΅ Monk Π±ΡΠ» ΡΠ°ΠΊΠΆΠ΅ Π€Π°Π±ΡΠΈΡΠ½ΡΠΌ :)
Π ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΡΠ°Π±ΡΠΈΡΠ½ΠΎΠ³ΠΎ ΠΌΠ΅ΡΠΎΠ΄Π° Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΎΡΡ, ΡΡΠΎ Π½Π°Ρ ΠΏΠ°ΡΡΠ΅ΡΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠ°, Π½ΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΌΡ Π½Π΅ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ, Ρ
ΠΎΡΡ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΠ·Π΄Π°ΡΡ ΠΊΠ»Π°ΡΡ ΠΠΎΠ½Π°ΡΡΡΡΡ ΠΊΠ°ΠΊ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΠΌ. ΠΠ΄Π΅ΡΡ ΠΈΠΌΠ΅Π΅ΡΡΡ Π²Π²ΠΈΠ΄Ρ ΡΠ»ΠΎΠ²ΠΎ Β«ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΒ» Π² Π±ΠΎΠ»Π΅Π΅ ΡΠΈΡΠΎΠΊΠΎΠΌ ΡΠΌΡΡΠ»Π΅.
Π’Π°ΠΊΠΆΠ΅ Π² ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΠ±ΠΊΠ»Π°ΡΡΠ°ΠΌ Π²ΡΠ±ΡΠ°ΡΡ ΠΊΠ»Π°ΡΡ ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°. ΠΠ΄Π΅ΡΡ ΠΌΡ ΠΊΠ°ΠΊ ΡΠ°Π· Π²ΠΈΠ΄ΠΈΠΌ, ΡΡΠΎ ΡΡΠ±ΠΊΠ»Π°ΡΡΡ (Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ) ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ Π΄Π°Π½Π½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ (Ρ. Π΅. ΠΈΠΌ Π΄Π΅Π»Π΅Π³ΠΈΡΡΡΡΡΡ ΡΡΠΈ ΠΏΠΎΠ»Π½ΠΎΠΌΠΎΡΠΈΡ ΠΏΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΌΠΎΠ½Π°Ρ
ΠΎΠ²).
Π’Π΅ΠΏΠ΅ΡΡ Π΄Π°Π²Π°ΠΉΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΈΡΠΈΠΌ Π½Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π²Π½Π΅ΡΠ΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΠΎΠ½Π°Ρ
ΠΈ Π±ΡΠ²Π°ΡΡ ΡΠ°Π·Π½ΡΠ΅ Π² ΡΠΎΠΉ ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅ΡΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ Π² ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²ΠΈΠΈ Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΠΎΠΉ ΡΠ΅ΡΠΊΠ²ΠΈ ΠΎ ΠΌΠΎΠ½Π°ΡΡΡΡΡΡ
ΠΈ ΠΌΠΎΠ½Π°ΡΠ΅ΡΡΠ²ΡΡΡΠΈΡ
(ΠΏΡΠΈΠ½ΡΡ Π½Π° ΠΡΡ
ΠΈΠ΅ΡΠ΅ΠΉΡΠΊΠΎΠΌ Π‘ΠΎΠ±ΠΎΡΠ΅ Π ΡΡΡΠΊΠΎΠΉ ΠΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΠΎΠΉ Π¦Π΅ΡΠΊΠ²ΠΈ 29 Π½ΠΎΡΠ±ΡΡ - 2 Π΄Π΅ΠΊΠ°Π±ΡΡ 2017 Π³ΠΎΠ΄Π°) ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ Π²ΡΠ²ΠΎΠ΄, ΡΡΠΎ ΠΌΠΎΠ½Π°Ρ
ΠΈ Π±ΡΠ²Π°ΡΡ 2 ΡΠΈΠΏΠΎΠ²:
- ΠΠ°Π»Π°Ρ ΡΡ
ΠΈΠΌΠ° (ΠΌΠ°Π½ΡΠΈΡ).
- Π‘Ρ
ΠΈΠΌΠ½ΠΈΡΠ΅ΡΡΠ²ΠΎ (Π²Π΅Π»ΠΈΠΊΠ°Ρ ΡΡ
ΠΈΠΌΠ°).
Π’Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅ΡΡΡΡ Β«ΠΏΡΠ΅Π΄ΡΠ³ΠΎΡΠΎΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ°ΠΏΡΒ», Π½ΠΎ Π»ΡΠ΄ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΌΠΎΠ½Π°Ρ
Π°ΠΌΠΈ Π½Π΅ ΡΡΠΈΡΠ°ΡΡΡΡ (Π’ΡΡΠ΄Π½ΠΈΠΊ, ΠΠΎΡΠ»ΡΡΠ½ΠΈΠΊ ΠΈ Π ΡΡΠΎΡΠΎΡ ΠΈΠ»ΠΈ ΠΠ½ΠΎΠΊ), Ρ. ΠΊ. Π½Π΅ Π΄Π°ΡΡ ΠΌΠΎΠ½Π°ΡΠ΅ΡΠΊΠΈΡ
ΠΎΠ±Π΅ΡΠΎΠ². ΠΠΎΡΡΠΎΠΌΡ ΠΈΡ
Π½Π΅ Π±Π΅ΡΠ΅ΠΌ Π²ΠΎ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅.
Π§ΡΠΎ ΠΆΠ΅ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅:
Π) ΠΠ»Π°ΡΡ ΠΠΎΠ½Π°ΡΡΡΡΡ (Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΊΠ° ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΠΎΠΌ ΠΌΠΎΠ½Π°ΡΠ΅ΡΡΠ²Π΅) Ρ Π€Π°Π±ΡΠΈΡΠ½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ:
public abstract class Monastery {
protected abstract Monk createMonk(String type);
}
ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΌΠΎΠ½Π°ΡΡΡΡΡ
public class OrthodoxMonastery extends Monastery {
@Override
protected Monk createMonk(String type) {
return new OrthodoxMonk(type);
}
}
Π) ΠΡΠΏΡΠ°Π²ΠΈΠΌ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ½Π°Ρ
Π°:
public abstract class Monk {
String kind;
public Monk(String kind) {
this.kind = kind;
}
public abstract void description();
}
ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΊΠ»Π°ΡΡ:
public class OrthodoxMonk extends Monk {
public OrthodoxMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
}
}
Π) ΠΡΠΎΠ²Π΅ΡΠΈΠΌ Π½Π°Ρ ΠΊΠΎΠ΄:
public class Main {
public static void main(String[] args) {
Monastery monastery = new OrthodoxMonastery();
monastery.createMonk("ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
").description();
monastery.createMonk("ΠΠ΅Π»ΠΈΠΊΠΎΡΡ
ΠΈΠΌΠ½ΠΈΠΊ").description();
}
}
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
β ΠΠ΅Π»ΠΈΠΊΠΎΡΡ
ΠΈΠΌΠ½ΠΈΠΊ
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π² ΠΏΠ°ΡΡΠ΅ΡΠ½ Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄, Π΄ΠΎΠ±ΠΈΠ»ΠΈΡΡ ΡΠΎΠ³ΠΎ ΡΡΠΎ Π½Π΅ ΠΏΡΠΈΡ
ΠΎΠ΄ΠΈΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ ΠΊΠ»Π°ΡΡΡ, ΡΠ°Π½Π΅Π΅ Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π½ΠΎ ΠΈ ΠΏΡΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡΠ°Π·ΠΎΠ² (Π²ΠΈΠ΄ΠΎΠ²) ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π²ΡΠ΅ ΠΎΡΠ΄Π΅Π½Π° ΠΈ ΠΊΠΎΠ½Π³ΡΠ΅Π³Π°ΡΠΈΠΈ ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΡ
ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² :) ΠΠΎ Π»ΡΡΡΠ΅ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° 3 ΡΠ°ΠΌΡΡ
ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ
, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΈΡ
Π±ΠΎΠ»Π΅Π΅ 100:
1) ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ
2) ΠΠ΅Π·ΡΠΈΡ
3) Π€ΡΠ°Π½ΡΠΈΡΠΊΠ°Π½Π΅Ρ
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΊΠ°ΠΊ ΠΈ ΡΠ°Π½Π΅Π΅ Ρ ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΌ ΠΌΠΎΠ½Π°Ρ
ΠΎΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Ρ
Π°:
public class CatholicMonk extends Monk {
public CatholicMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
}
}
ΠΈ ΠΊΠ»Π°ΡΡ ΠΌΠΎΠ½Π°ΡΡΡΡΡ:
public class CatholicMonastery extends Monastery {
@Override
protected Monk createMonk(String type) {
return new CatholicMonk(type);
}
}
ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΠΊΠΎΠ΄:
public class Main {
public static void main(String[] args) {
Monastery monastery;
monastery = new OrthodoxMonastery();
monastery.createMonk("ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
").description();
monastery.createMonk("ΠΠ΅Π»ΠΈΠΊΠΎΡΡ
ΠΈΠΌΠ½ΠΈΠΊ").description();
monastery = new CatholicMonastery();
monastery.createMonk("ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ").description();
monastery.createMonk("ΠΠ΅Π·ΡΠΈΡ").description();
monastery.createMonk("Π€ΡΠ°Π½ΡΠΈΡΠΊΠ°Π½Π΅Ρ").description();
}
}
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π»ΠΈΠΊΠΎΡΡ
ΠΈΠΌΠ½ΠΈΠΊ
Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ
Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π·ΡΠΈΡ
Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- Π€ΡΠ°Π½ΡΠΈΡΠΊΠ°Π½Π΅Ρ
ΠΠ° ΡΡΠΎΠΌ Ρ ΡΡΠΈΠΌ ΠΏΠ°ΡΡΠ΅ΡΠ½ΠΎΠΌ Π·Π°ΠΊΠΎΠ½ΡΠΈΠΌ.
ΠΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ°ΠΊΠΆΠ΅ Π·Π°ΡΠ°Π½Π΅Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π² ΠΊΠ»Π°ΡΡ E-num, Π½ΠΎ Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ΄Π° ΠΎΠ±ΠΎΠΉΠ΄Π΅ΠΌΡΡ Π±Π΅Π· ΡΡΠΎΠ³ΠΎ.
ΠΠ°ΡΡΠ°Π»ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΠ°ΡΡΠ΅ΡΠ½Π° ΠΠ±ΡΡΡΠ°ΠΊΡΠ½Π°Ρ Π€Π°Π±ΡΠΈΠΊΠ°.
ΠΠΎΠ½Π°Ρ
ΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ, ΡΠ΅ΠΏΠ΅ΡΡ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΈΠΌ ΠΎΠ΄Π΅ΠΆΠ΄Ρ, ΡΠ΅ΡΠΊΠΈ ΠΈ ΡΠ΄.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ, Ρ. Π΅. Π΅ΡΠ»ΠΈ Π²Π΅ΡΠ½ΡΡΡΡ ΠΊ Π½Π°ΡΠ΅ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π² Π½Π°ΡΠ°Π»Π΅ ΡΠ΅ΠΌΠ΅ΠΉΡΡΠ²ΠΎΠΌ Π²Π·Π°ΠΈΠΌΠΎΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΠΈΠ»ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡΡ
ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΊΠ°ΠΊ ΡΠ°Π· ΠΈ ΡΡΠ°Π½Π΅Ρ ΠΎΠ΄Π΅ΠΆΠ΄Π°.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, Π·Π°ΠΊΠ»ΡΡΠ°ΡΡΠ΅ΠΉΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° ΠΌΠΎΠ½Π°Ρ
Π° ΡΠ°Π·Π½ΡΠ΅ ΠΎΠ±Π»Π°ΡΠ΅Π½ΠΈΡ. ΠΡΠ»ΠΈ Π΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π±ΡΠ΄Π΄ΠΈΡΡΡΠΊΠΎΠ³ΠΎ, ΡΠΎ Π²ΠΎΠΎΠ±ΡΠ΅ ΡΠ°Π·Π½ΡΠ΅ Π±ΡΠ΄ΡΡ :)
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΠ·Π΄Π°ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΡΠ°Π±ΡΠΈΠΊΠΈ, ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠΎΠ·Π΄Π°Π²Π°Π»ΠΈ Π±Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΡΡ ΠΎΠ΄Π΅ΠΆΠ΄Ρ.
ΠΠΎΡΡΠΎΠΌΡ
Π) Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΡΠ°Π±ΡΠΈΠΊΡ Π΄Π»Ρ ΠΈΠ·Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΠ΄Π΅ΠΆΠ΄Ρ
public interface MonkFactory {
Clothing createClothing();
}
ΠΈ Π΅Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ
public class OrthodoxMonkFactory implements MonkFactory {
@Override
public Clothing createClothing() {
return new OrtodoxClothing();
}
}
public class CatholicMonkFactory implements MonkFactory {
@Override
public Clothing createClothing() {
return new CatholicClothing();
}
}
public class AnglicanMonkFactory implements MonkFactory {
@Override
public Clothing createClothing() {
return new AnglicanClothing();
}
}
Π½Ρ ΠΈ ΠΏΡΠΎ Π±ΡΠ΄Π΄ΠΈΡΡΡΠΊΠΈΡ
ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² Π½Π΅ Π·Π°Π±ΡΠ΄Π΅ΠΌ :)
public class BuddhistMonkFactory implements MonkFactory {
@Override
public Clothing createClothing() {
return new BuddhistClothing();
}
}
Π) Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΊΠ»Π°ΡΡ ΠΎΠ΄Π΅ΠΆΠ΄Ρ (Π΄Π»Ρ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΡΠΌΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ ΠΌΠΎΠ½Π°Ρ
ΠΎΠ², Π½Π΅ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ):
public abstract class Clothing {
private String name;
public Clothing(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΡ
public class OrtodoxClothing extends Clothing {
public OrtodoxClothing() {
super("ΠΠ°Π½ΡΠΈΡ");
}
}
public class CatholicClothing extends Clothing {
public CatholicClothing() {
super("Π ΡΡΠ° Ρ ΠΊΠ°ΠΏΡΡΠΎΠ½ΠΎΠΌ");
}
}
public class AnglicanClothing extends Clothing {
public AnglicanClothing() {
super("Π ΡΡΠ°");
}
}
public class BuddhistClothing extends Clothing {
public BuddhistClothing() {
super("ΠΠ°ΡΠ°Ρ");
}
}
Π) ΠΠ°Π»Π΅Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡΡ ΠΌΠΎΠ½Π°Ρ
ΠΎΠ², ΡΡΠΎΠ±Ρ Ρ Π½ΠΈΡ
Π±ΡΠ»Π° ΠΎΠ΄Π΅ΠΆΠ΄Π°:
public abstract class Monk {
String kind;
Clothing clothing;
public Monk(String kind) {
this.kind = kind;
}
public void setClothing(Clothing clothing) {
this.clothing = clothing;
}
public abstract void description();
}
public class OrthodoxMonk extends Monk {
public OrthodoxMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
}
public class CatholicMonk extends Monk {
public CatholicMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
}
public class AnglicanMonk extends Monk {
public AnglicanMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
}
public class BuddhistMonk extends Monk {
public BuddhistMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― Π±ΡΠ΄Π΄ΠΈΠΉΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
}
Π) Π ΠΊΠ»Π°ΡΡΠ΅ ΠΌΠΎΠ½Π°ΡΡΡΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π½Π°Ρ Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄
public abstract class Monastery {
public Monk create(MonkFactory monkFactory, String type) {
Monk monk = createMonk(type);
monk.setClothing(monkFactory.createClothing());
return monk;
}
protected abstract Monk createMonk(String type);
}
ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Ρ Π½Π°Ρ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ
public class OrthodoxMonastery extends Monastery {
@Override
protected Monk createMonk(String type) {
return new OrthodoxMonk(type);
}
}
public class CatholicMonastery extends Monastery {
@Override
protected Monk createMonk(String type) {
return new CatholicMonk(type);
}
}
public class AnglicanMonastery extends Monastery {
@Override
protected Monk createMonk(String type) {
return new AnglicanMonk(type);
}
}
public class BuddhistMonastery extends Monastery {
@Override
protected Monk createMonk(String type) {
return new BuddhistMonk(type);
}
}
Π) ΠΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ:
public class Main {
public static void main(String[] args) {
Monastery monastery;
monastery = new OrthodoxMonastery();
monastery.create(new OrthodoxMonkFactory(), "ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
").description();
monastery = new CatholicMonastery();
monastery.create(new CatholicMonkFactory(), "ΠΠ΅Π·ΡΠΈΡ").description();
monastery = new AnglicanMonastery();
monastery.create(new AnglicanMonkFactory(), "ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ").description();
monastery = new BuddhistMonastery();
monastery.create(new BuddhistMonkFactory(), "ΠΠΎΠ½Π°Ρ
").description();
}
}
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠΠ°Π½ΡΠΈΡ
Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π·ΡΠΈΡ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - Π ΡΡΠ° Ρ ΠΊΠ°ΠΏΡΡΠΎΠ½ΠΎΠΌ
Π― Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - Π ΡΡΠ°
Π― Π±ΡΠ΄Π΄ΠΈΠΉΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠΎΠ½Π°Ρ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠΠ°ΡΠ°Ρ
ΠΡΠ»ΠΈΡΠ½ΠΎ ΡΠ°Π±ΡΠΈΠΊΠ° ΡΠΎΠ·Π΄Π°ΡΡΠ°Ρ ΠΎΠ΄Π΅ΠΆΠ΄Ρ Π·Π°ΡΠ°Π±ΠΎΡΠ°Π»Π°. Π’Π΅ΠΏΠ΅ΡΡ Π² ΡΠ°Π±ΡΠΈΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΈΠ·Π³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½Π²Π΅Π½ΡΠ°ΡΡ Π΄Π»Ρ ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² Π΄Π»Ρ ΡΡΠΏΠ΅ΡΠ½ΠΎΠΉ ΠΌΠΎΠ»ΠΈΡΠ²Ρ (ΡΠ΅ΡΠΊΠΈ ΠΈ ΡΠ΄.). ΠΠΎ ΠΎΡΡΠ°Π΅ΡΡΡ Π΅ΡΠ΅ Π²ΠΎΠΏΡΠΎΡ, Π° ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈ 2 ΠΏΠ°ΡΡΠ΅ΡΠ½Π° Π²ΠΌΠ΅ΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ. ΠΠΎΠ½Π΅ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ :)
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠΏΡΠΎΠ±ΡΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π·Π°ΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅ΡΠ΅ ΠΈΠ½Π΄ΡΠΈΡΡΡΠΊΠΎΠ³ΠΎ ΠΌΠΎΠ½Π°Ρ
Π°:
Π) Π€Π°Π±ΡΠΈΠΊΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΠΌΠΎΠ½Π°Ρ
ΠΎΠ² public interface MonkFactory {
Monk createMonk(String type);
Clothing createClothing();
}
public class OrthodoxMonkFactory implements MonkFactory {
@Override
public Monk createMonk(String type){
return new OrthodoxMonk(type);
}
@Override
public Clothing createClothing() {
return new OrtodoxClothing();
}
}
public class CatholicMonkFactory implements MonkFactory {
@Override
public Monk createMonk(String type){
return new CatholicMonk(type);
}
@Override
public Clothing createClothing() {
return new CatholicClothing();
}
}
public class AnglicanMonkFactory implements MonkFactory {
@Override
public Monk createMonk(String type){
return new AnglicanMonk(type);
}
@Override
public Clothing createClothing() {
return new AnglicanClothing();
}
}
public class BuddhistMonkFactory implements MonkFactory {
@Override
public Monk createMonk(String type){
return new BuddhistMonk(type);
}
@Override
public Clothing createClothing() {
return new BuddhistClothing();
}
}
public class HinduMonkFactory implements MonkFactory {
@Override
public Monk createMonk(String type){
return new HinduMonk(type);
}
@Override
public Clothing createClothing() {
return new HinduClothing();
}
}
Π) ΠΠ»Π°ΡΡ ΠΌΠΎΠ½Π°ΡΡΡΡΡ + ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠ»Π°ΡΡΠ° ΠΠΎΠ½Π°ΡΡΡΡΡ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠ΅ Π½Π°ΠΌ Π½Π΅ Π½ΡΠΆΠ½Ρ, ΠΈΡ
ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΡΠ°Π±ΡΠΈΠΊΠ° (ΠΌΠΎΠΆΠ½ΠΎ Π±ΡΠ»ΠΎ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ ΠΈΡ
ΠΎΡΡΠ°Π²ΠΈΡΡ, Π° ΡΠ°Π±ΡΠΈΠΊΠΈ ΡΠ΄Π°Π»ΠΈΡΡ, Π½ΠΎ ΠΏΠΎ ΡΡΡΠΈ ΠΎΠ½ΠΈ Π±ΡΠ»ΠΈ Π±Ρ ΡΠΎΠ³Π΄Π° ΠΏΡΠΎΡΡΠΎ Π²ΠΌΠ΅ΡΡΠΎ ΡΠ°Π±ΡΠΈΠΊ, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΠΎΠ½Π°ΡΡΡΡΡ ΡΠΎΠ³Π΄Π° ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ ΡΠ΄Π΅Π»Π°ΡΡ, Π° Π½Π΅ Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΌ ΠΊΠ»Π°ΡΡΠΎΠΌ).
Π Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠ»Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
public class Application {
public Monk create(MonkFactory monkFactory, String type) {
Monk monk = monkFactory.createMonk(type);
monk.prepare(monkFactory);
return monk;
}
}
Π) ΠΠΎΠ½Π°Ρ
ΠΈ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠ°Ρ
public abstract class Monk {
String kind;
Clothing clothing;
public Monk(String kind) {
this.kind = kind;
}
public void setClothing(Clothing clothing) {
this.clothing = clothing;
}
public abstract void description();
public abstract void prepare(MonkFactory monkFactory);
}
Π² ΡΠ΅Π±Π΅ ΡΠ°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ Π² ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡΡ
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ°Π±ΡΠΈΠΊΠΈ:
public class OrthodoxMonk extends Monk {
public OrthodoxMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
@Override
public void prepare(MonkFactory monkFactory) {
setClothing(monkFactory.createClothing());
}
}
public class CatholicMonk extends Monk {
public CatholicMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
@Override
public void prepare(MonkFactory monkFactory) {
setClothing(monkFactory.createClothing());
}
}
public class AnglicanMonk extends Monk {
public AnglicanMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
@Override
public void prepare(MonkFactory monkFactory) {
setClothing(monkFactory.createClothing());
}
}
public class BuddhistMonk extends Monk {
public BuddhistMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― Π±ΡΠ΄Π΄ΠΈΠΉΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
@Override
public void prepare(MonkFactory monkFactory) {
setClothing(monkFactory.createClothing());
}
}
public class HinduMonk extends Monk {
public HinduMonk(String kind) {
super(kind);
}
@Override
public void description() {
System.out.println("Π― ΠΈΠ½Π΄ΡΠΈΡΡΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- " + kind);
System.out.println("ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - " + clothing.getName());
}
@Override
public void prepare(MonkFactory monkFactory) {
setClothing(monkFactory.createClothing());
}
}
Π) Π ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ:
public class Main {
public static void main(String[] args) {
Application application = new Application();
application.create(new OrthodoxMonkFactory(), "ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
").description();
application.create(new CatholicMonkFactory(), "ΠΠ΅Π·ΡΠΈΡ").description();
application.create(new AnglicanMonkFactory(), "ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ").description();
application.create(new BuddhistMonkFactory(), "ΠΠΎΠ½Π°Ρ
").description();
application.create(new HinduMonkFactory(), "Π‘Π°Π½ΡΡΡΠΈ").description();
}
}
Π― ΠΏΡΠ°Π²ΠΎΡΠ»Π°Π²Π½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ°Π½ΡΠΈΠΉΠ½ΡΠΉ ΠΌΠΎΠ½Π°Ρ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠΠ°Π½ΡΠΈΡ
Π― ΠΊΠ°ΡΠΎΠ»ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π·ΡΠΈΡ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - Π ΡΡΠ° Ρ ΠΊΠ°ΠΏΡΡΠΎΠ½ΠΎΠΌ
Π― Π°Π½Π³Π»ΠΈΠΊΠ°Π½ΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠ΅Π½Π΅Π΄ΠΈΠΊΡΠΈΠ½Π΅Ρ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - Π ΡΡΠ°
Π― Π±ΡΠ΄Π΄ΠΈΠΉΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- ΠΠΎΠ½Π°Ρ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠΠ°ΡΠ°Ρ
Π― ΠΈΠ½Π΄ΡΠΈΡΡΡΠΊΠΈΠΉ ΠΌΠΎΠ½Π°Ρ
- Π‘Π°Π½ΡΡΡΠΈ
ΠΠΎΡ ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠΠΎΡΡΠΈ Π½ΠΈΡΠ΅Π³ΠΎ, ΡΠ΅ΠΏΠ»ΠΎ ΠΆΠ΅ :)
Π Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Π€Π°Π±ΡΠΈΡΠ½ΡΠΉ ΠΌΠ΅ΡΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π» Π°Π±ΡΡΡΠ°ΠΊΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ Ρ Π½Π΅ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²ΡΠ²Π°Π»ΡΡ Π² ΡΡΠ±ΠΊΠ»Π°ΡΡΠ°Ρ
, Π° ΠΠ±ΡΡΡΠ°ΠΊΡΠ½Π°Ρ ΡΠ°Π±ΡΠΈΠΊΠ° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ, Π³Π΄Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ (Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠ½Π°Ρ
Π°) ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΠ»Π° Π² ΠΊΠ»Π°ΡΡΠ°Ρ
, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π²ΡΠΈΡ
Π΄Π°Π½Π½ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ.