JavaRush/Java Π±Π»ΠΎΠ³/Java Developer/ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π€Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Factory Method) ΠΈ Абстрактная Π€...

ΠŸΠ°Ρ‚Ρ‚Π΅Ρ€Π½Ρ‹ Π€Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ (Factory Method) ΠΈ Абстрактная Π€Π°Π±Ρ€ΠΈΠΊΠ° (Abstract Factory)

Π‘Ρ‚Π°Ρ‚ΡŒΡ ΠΈΠ· Π³Ρ€ΡƒΠΏΠΏΡ‹ Java Developer
участников
Π’ ΠΊΠ½ΠΈΠ³Π΅ β€œ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();
    }
}
Π― православный ΠΌΠΎΠ½Π°Ρ… - ΠœΠ°Π½Ρ‚ΠΈΠΉΠ½Ρ‹ΠΉ ΠΌΠΎΠ½Π°Ρ…
Моя ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠœΠ°Π½Ρ‚ΠΈΡ
Π― католичСский ΠΌΠΎΠ½Π°Ρ… - Π˜Π΅Π·ΡƒΠΈΡ‚
Моя одСТда - Ряса с капюшоном
Π― англиканский ΠΌΠΎΠ½Π°Ρ… - Π‘Π΅Π½Π΅Π΄ΠΈΠΊΡ‚ΠΈΠ½Π΅Ρ†
Моя одСТда - Ряса
Π― буддийский ΠΌΠΎΠ½Π°Ρ… - ΠœΠΎΠ½Π°Ρ…
Моя одСТда - Кашая
Π― индуистский ΠΌΠΎΠ½Π°Ρ… - Баньяси
Моя ΠΎΠ΄Π΅ΠΆΠ΄Π° - ΠŸΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ, Ρ‚Π΅ΠΏΠ»ΠΎ ΠΆΠ΅ :)
Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π€Π°Π±Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ использовал абстрактный класс с Π½Π΅Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ рСализовывался Π² субклассах, Π° Абстрактная Ρ„Π°Π±Ρ€ΠΈΠΊΠ° использовала интСрфСйс, Π³Π΄Π΅ рСализация (Π² нашСм случаС созданиС ΠΌΠΎΠ½Π°Ρ…Π°) происходила Π² классах, ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π²ΡˆΠΈΡ… Π΄Π°Π½Π½Ρ‹ΠΉ интСрфСйс.
ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ (2)
  • популярныС
  • Π½ΠΎΠ²Ρ‹Π΅
  • старыС
Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π’Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π°Π²Ρ‚ΠΎΡ€ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ
14 апрСля 2022, 13:37
ЧитаСтся ΠΊΠ°ΠΊ-Ρ‚ΠΎ слоТновато
Иван Π§Π΅ΠΏΡƒΡ€ΠΈΠ½ Junior QA inginer Π² ΠŸΠ΅Ρ€Ρ„ΠΎΡ€ΠΌΠ°Π½Ρ Π›Π°Π±
23 дСкабря 2021, 14:16
Для Π½Π΅ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ³ΠΎ читатСля Π² послСднСм Π°Π±Π·Π°Ρ†Π΅ самым понятным окаТСтся Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² скобках)