JavaRush /Java Blog /Random-TK /Zawod usuly we abstrakt zawod nagyşlary

Zawod usuly we abstrakt zawod nagyşlary

Toparda çap edildi
“Ilki bilen kelläň. Dizaýn nagyşlary ”bu nagyşlary aşakdaky ýaly kesgitleýär: Zawod usuly nagşy obýekt döretmek üçin interfeýsi kesgitleýär, ýöne kiçi toparlara dörediljek mysal synpyny saýlamaga mümkinçilik berýär. Şeýlelik bilen, Zawod usuly dessine amallary kiçi toparlara berýär. Abstrakt zawod nagşy, anyk synplaryny görkezmezden özara baglanyşykly ýa-da garaşly zatlaryň maşgalalaryny döretmek üçin interfeýs üpjün edýär. Geliň, has jikme-jik düşünmäge synanyşalyň. Aýdaly bolalyň ... (bu ýerde özboluşly we üýtgeşik bir zat gerek) monah bolmak kararyna gelen adamlar hakda oýun ýazmak kararyna gelýärsiňiz. Aşakdakylardan başlap bileris. 1) Monah synpyny we çagalar synplaryny dörediň (geliň ilki birini döredeliň):
public abstract class Monk {

    public abstract void description();
}
public class OrthodoxMonk extends Monk {
    @Override
    public void description() {
        System.out.println("Я православный монах");
    }
}
2) Elbetde, “monastiki kasamlary” ýerine ýetirip boljak monastyr synpyny dörediň:
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;
    }
}
Geliň, netijäni barlap göreliň:
public class Main {
    public static void main(String[] args) {
        Monastery monastery = new Monastery();
        monastery.createMonk("ORTODOX");
        monastery.getMonk().description();
    }
}
Я православный монах
Indi döretmeli bolsaňyz ... katolik monah, size A) katolik monah üçin täze synp döretmeli:
public class CatholicMonk extends Monk {
    @Override
    public void description() {
        System.out.println("Я католический монах");
    }
}
B) Monastyr synpyna üýtgeşmeler giriziň:
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;
    }
}
we şonuň üçin her gezek monahlaryň täze görnüşleri girizilende, täze synp döretmeli we bar bolanlaryny redaktirlemeli bolarsyňyz. Bu ýagdaýda monastyr synpymyzy üýtgeşmelerden nädip “gurşap almak” üçin edilip bilner. Zawod usuly usulyny ulanyp görüp bilersiňiz. Görnüşi A) Geliň, monah synpyny terk edeliň, Angliýaly monahy goşmakdan başga (diňe katolikler we prawoslaw hristianlar monastizm däl):
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("Я англиканский монах");
    }
}
B) Geliň, monastyr synpyny aşakdaky ýaly üýtgedeliň (geliň we usuly abstrakt edeliň). Bu ýerde diňe Zawod usulyny ulanýarys :
public abstract class Monastery {
    protected abstract Monk createMonk();
}
usuly durmuşa geçirmek bilen çaga synplaryny döretmek:
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();
    }
}
B) Kody barlalyň
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();
    }
}
Я православный монах
Я католический монах
Я англиканский монах
Bular. häzir görşümiz ýaly, monahlaryň täze görnüşlerini goşanyňyzda, bar bolan synplary üýtgetmegiň zerurlygy bolmaz, diňe zerur bolsa täzelerini goşuň (belli bir monastyryň we monahyň synpy). Belki, monah synpynda ilkibaşdan beýan ediş usulynyň hem Zawoddygyna göz ýetiren bolsa gerek :) Zawod usulynyň kesgitlemesi, nagşymyzyň obýekt döretmek üçin interfeýsi kesgitleýändigini aýtdy, ýöne hiç zat döretmedik interfeýsler, monastyr synpyny interfeýs hökmünde döredip we ony belli bir durmuşa geçirip bileris. Bu has giň manyda “interfeýs” sözüne degişlidir. Şeýle hem kesgitleme, kiçi toparlara döredýän mysallarynyň synpyny saýlamaga mümkinçilik berýändigini aýtdy . Bu ýerde diňe kiçi synplaryň (çaga synplary) bu usuly durmuşa geçirýändigini görýäris (ýagny monah obýektlerini döretmek üçin bu ygtyýarlyklar olara berilýär). Indi programmamyzy biraz giňeldeliň, bir konfessiýada dürli monahlaryň bolmagy mümkinçiligini hödürläliň. Mysal üçin, prawoslaw kilisesiniň monastyrlar we monastyrlar baradaky pozisiýasyna esaslanyp (2017-nji ýylyň 29-njy noýabryndan 2-nji dekabry aralygynda Rus prawoslaw kilisesiniň opsepiskoplar geňeşinde kabul edildi), monahlaryň 2 görnüşi bar diýen netijä gelip bileris. : - Has kiçi shema (mantiýa). - Shema (uly shema). “Taýýarlyk tapgyrlary” hem bar, ýöne adamlar monah kasam etmeýändikleri üçin monah (Trudnik, Nowice we Rýasofor ýa-da Monah) hasaplanmaýar. Şonuň üçin biz olary göz öňünde tutmaýarys. Bu ýagdaýda näme alarys: A) Monastyr synpy (ýönekeýleşdirmek üçin, häzirlikçe prawoslaw monastizmine üns bereliň) Zawod usuly bilen :
public abstract class Monastery {
    protected abstract Monk createMonk(String type);
}
we belli bir monastyr
public class OrthodoxMonastery extends Monastery {

    @Override
    protected Monk createMonk(String type) {
        return new OrthodoxMonk(type);
    }
}
B) Monah synpyny düzeliň:
public abstract class Monk {
    String kind;

    public Monk(String kind) {
        this.kind = kind;
    }

    public abstract void description();
}
we çagalar synpy:
public class OrthodoxMonk extends Monk {
    public OrthodoxMonk(String kind) {
        super(kind);
    }

    @Override
    public void description() {
        System.out.println("Я православный монах - " + kind);
    }
}
C) Geliň kodumyzy barlalyň:
public class Main {
    public static void main(String[] args) {
        Monastery monastery = new OrthodoxMonastery();
        monastery.createMonk("Мантийный монах").description();
        monastery.createMonk("Великосхимник").description();
    }
}
Я православный монах - Мантийный монах
Я православный монах — Великосхимник
Şeýlelik bilen, Zawod usuly usulyny ulanyp, ozal ýazylan synplary üýtgetmeli däldigimize ýetdik, ýöne monahlaryň şekillerini (görnüşlerini) giňeldenimizde, kodda azyndan üýtgeşmeler talap edilýär. Katolik monahlaryň ähli buýruklaryny we ýygnaklaryny barlap göreliň :) Emma iň meşhur 3 adama ünsi jemlemek has gowudyr, sebäbi olaryň 100-den gowragy bar: 1) Benediktine 2) uitezit 3) Fransiskan Muny öňküsi ýaly etmek prawoslaw monah, katolik monahynyň belli bir synpyny durmuşa geçirmeli:
public class CatholicMonk extends Monk {
    public CatholicMonk(String kind) {
        super(kind);
    }

    @Override
    public void description() {
        System.out.println("Я католический монах - " + kind);
    }
}
we monastyr synpy:
public class CatholicMonastery extends Monastery {

    @Override
    protected Monk createMonk(String type) {
        return new CatholicMonk(type);
    }
}
we kody barlaň:
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();
    }
}
Я православный монах - Мантийный монах
Я православный монах - Великосхимник
Я католический монах - Бенедиктинец
Я католический монах - Иезуит
Я католический монах - Францисканец
Geliň, bu nagyş bilen gutaralyň. Bu görnüşli monahlaryň hemmesini E-num synpyna öňünden goşup bolýardy, ýöne kodsyz ýönekeýleşdirmek üçin. Abstrakt zawod nagşynyň wagty geldi. Monahlarymyz bar, indi olara eşik, rozariýa we ş.m. ýasap bilerdik. Geýim bilen başlalyň, ýagny başda kesgitlemämize gaýdyp gelsek, eşikler biri-birine bagly ýa-da garaşly zatlaryň maşgalasyna öwrüler . Geliň, monahyň her görnüşiniň dürli eşikleri bar. Budisti hem goşsak, düýbünden başgaça bolar :) Munuň üçin zawod interfeýsini döredip bileris, durmuşa geçirilmegi zerur eşikleri döreder. Şonuň üçin A) Egin-eşik öndürýän zawod döredýäris
public interface MonkFactory {
    Clothing createClothing();
}
we durmuşa geçirilmegi
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();
    }
}
Bolýar, Buddist monahlaryny ýatdan çykaralyň :)
public class BuddhistMonkFactory implements MonkFactory {

    @Override
    public Clothing createClothing() {
        return new BuddhistClothing();
    }
}
B) Egin-eşik synpyny dörediň (ýönekeýleşdirmek üçin, monahlaryň eşikleriniň esasy elementini alalyň, jikme-jik maglumat bermeris):
public abstract class Clothing {
    private String name;

    public Clothing(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}
we çagalar sapaklary
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("Кашая");
    }
}
C) Soňra, monahlaryň synplaryny eşikleri bolar ýaly üýtgedýäris:
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());
    }
}
D) Monastyr synpynda Zawod usulymyz bar
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);
}
durmuşa geçirişimiz üýtgemedi
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);
    }
}
D) Netijäni barlaň:
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();
    }
}
Я православный монах - Мантийный монах
Моя одежда - Мантия
Я католический монах - Иезуит
Моя одежда - Ряса с капюшоном
Я англиканский монах - Бенедиктинец
Моя одежда - Ряса
Я буддийский монах - Монах
Моя одежда - Кашая
Egin-eşik döredýän zawod gowy işläp başlady. Indi zawodda monahlar üçin üstünlikli doga (rozariýa monjuklary we ş.m.) enjamlaryny öndürip bilersiňiz. Emma sorag henizem dowam edýär, bilelikde 2 nagyş ulanyp bolarmy? Elbetde başararsyňyz :) Geliň, taslamamyzyň iň soňky wersiýasyny taýýarlamaga we hindi monahyny goşmaga synanyşalyň: A) Zawodlar indi monahlary “ýyldyz zawody” ýaly sesler döredýärler :
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();
    }
}
B) Monastyr synpy + Monastyr synpynyň anyk durmuşa geçirilmegi zerur däl, zawod tarapyndan amala aşyrylýar (tersine, biz olary taşlap zawodlary aýryp bilerdik, ýöne aslynda olar diňe zawodlaryň ýerine bolardy, diňe bu ýagdaýda monastyr abstrakt synp däl-de, interfeýs bolmalydy). Programma synpyny goşuň:
public class Application {

    public Monk create(MonkFactory monkFactory, String type) {
        Monk monk = monkFactory.createMonk(type);
        monk.prepare(monkFactory);
        return monk;
    }
}
B) Monahlarda indi bar
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);
}
zawodyň kömegi bilen amala aşyrylýan zawod usulyny öz içine alýar:
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());
    }
}
D) Geliň, barlap göreliň:
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();
    }
}
Я православный монах - Мантийный монах
Моя одежда - Мантия
Я католический монах - Иезуит
Моя одежда - Ряса с капюшоном
Я англиканский монах - Бенедиктинец
Моя одежда - Ряса
Я буддийский монах - Монах
Моя одежда - Кашая
Я индуистский монах - Саньяси
Моя одежда - Почти ничего, тепло же :)
Sözümiň ahyrynda, Zawod usulynyň ýerine ýetirilmedik usul bilen abstrakt synpy ulanandygyny, abstrakt zawodyň ýerine ýetirilen synplarda ýerine ýetirişiň (biziň ýagdaýymyzda monah döretmek) interfeýs ulanylandygyny belläp bilersiňiz. bu interfeýs.
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION