JavaRush /Blog Jawa /Random-JV /Metode Pabrik lan Pola Pabrik Abstrak

Metode Pabrik lan Pola Pabrik Abstrak

Diterbitake ing grup
Ing buku "Head First. Pola Desain" nemtokake pola kasebut ing ngisor iki: Pola Metode Pabrik nemtokake antarmuka kanggo nggawe obyek, nanging ngidini subkelas milih kelas saka conto sing bakal digawe. Mangkono, metode Pabrik delegasi operasi instantiasi menyang subkelas. Pola Pabrik Abstrak nyedhiyakake antarmuka kanggo nggawe kulawarga obyek sing saling gegandhengan utawa saling gumantung tanpa nemtokake kelas konkrit. Ayo coba ngerti iki kanthi luwih rinci. Ayo dadi ngomong sampeyan arep kanggo nulis game bab wong sing arep dadi ... (sampeyan kudu soko asli lan mboten umum kene) wiku. Kita bisa miwiti karo ing ngisor iki. 1) Nggawe kelas Monk lan kelas bocah (ayo nggawe siji dhisik):
public abstract class Monk {

    public abstract void description();
}
public class OrthodoxMonk extends Monk {
    @Override
    public void description() {
        System.out.println("Я православный монах");
    }
}
2) Lan mesthi, nggawe kelas Biara, ing ngendi sampeyan bisa ngetrapake "sumpah biara":
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;
    }
}
Inggih, ayo mriksa asil:
public class Main {
    public static void main(String[] args) {
        Monastery monastery = new Monastery();
        monastery.createMonk("ORTODOX");
        monastery.getMonk().description();
    }
}
Я православный монах
Saiki yen sampeyan kudu nggawe ... biksu Katolik, sampeyan kudu A) Nggawe kelas anyar kanggo biksu Katolik:
public class CatholicMonk extends Monk {
    @Override
    public void description() {
        System.out.println("Я католический монах");
    }
}
B) Nggawe owah-owahan ing kelas biara:
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;
    }
}
lan saben-saben jinis biksu anyar ditepangake, sampeyan kudu nggawe kelas anyar lan ngowahi kelas sing wis ana. Apa bisa rampung ing kasus iki kanggo piye wae "encapsulate" kelas biara kita saka owah-owahan. Sampeyan bisa nyoba nggunakake pola Metode Pabrik. Carane bakal katon A) Ayo ninggalake kelas biarawan kaya, kajaba mbok menawa nambah biksu Anglikan (ora mung Katolik lan Kristen Ortodoks duwe monasticism):
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) Ayo ganti kelas biara kaya ing ngisor iki (ayo digawe abstrak lan metodee). Ing kene kita mung nggunakake metode Pabrik:
public abstract class Monastery {
    protected abstract Monk createMonk();
}
lan nggawe kelas anak kanthi implementasi metode:
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) Ayo mriksa kode
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();
    }
}
Я православный монах
Я католический монах
Я англиканский монах
Sing. kaya sing saiki kita deleng, nalika nambahake jinis bhikkhu anyar, ora perlu ngganti kelas sing wis ana, nanging mung yen perlu, nambah sing anyar (kelas biara lan bhikkhu tartamtu). Mbok menawa ana sing wis ngerteni manawa metode deskripsi, sing wiwit wiwitan ing kelas Monk, uga Pabrik :) Definisi metode pabrik ujar manawa pola kita nemtokake antarmuka kanggo nggawe obyek, nanging kita ora nggawe apa wae. antarmuka, sanajan kita bisa nggawe kelas Biara minangka antarmuka lan ngleksanakake ing implementasine tartamtu. Iki nuduhake tembung "antarmuka" ing pangertèn sing luwih jembar. Dhéfinisi kasebut uga nyatakake yen ngidini subkelas kanggo milih kelas saka conto sing digawe . Ing kene kita mung weruh yen subclasses (kelas anak) ngleksanakake metode iki (yaiku, kekuwatan kanggo nggawe obyek biarawan didelegasikan menyang dheweke). Saiki ayo nggedhekake program kita sethithik, ngenalake kemungkinan ana biksu beda ing siji denominasi utawa liyane. Contone, ing Ortodoks, adhedhasar posisi Gréja Ortodoks ing biara lan monastik (diadopsi ing Dewan Uskup Gréja Ortodoks Rusia tanggal 29 November - 2 Desember 2017), kita bisa nyimpulake yen ana 2 jinis biksu. : - Skema sing luwih cilik (mantle). - Skema (skema gedhe). Ana uga "tahap persiapan", nanging wong-wong ora dianggep biksu (Trudnik, Novice lan Ryasophor utawa Monk), amarga ora njupuk sumpah monastik. Mulane, kita ora njupuk menyang akun. Apa sing kita entuk ing kasus iki: A) Kelas Biara (kanggo nyederhanakake, ayo fokus ing monastik Ortodoks saiki) kanthi metode Pabrik :
public abstract class Monastery {
    protected abstract Monk createMonk(String type);
}
lan biara tartamtu
public class OrthodoxMonastery extends Monastery {

    @Override
    protected Monk createMonk(String type) {
        return new OrthodoxMonk(type);
    }
}
B) Ayo ndandani kelas biksu:
public abstract class Monk {
    String kind;

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

    public abstract void description();
}
lan kelas anak:
public class OrthodoxMonk extends Monk {
    public OrthodoxMonk(String kind) {
        super(kind);
    }

    @Override
    public void description() {
        System.out.println("Я православный монах - " + kind);
    }
}
C) Ayo mriksa kode kita:
public class Main {
    public static void main(String[] args) {
        Monastery monastery = new OrthodoxMonastery();
        monastery.createMonk("Мантийный монах").description();
        monastery.createMonk("Великосхимник").description();
    }
}
Я православный монах - Мантийный монах
Я православный монах — Великосхимник
Mangkono, kanthi nggunakake pola Metode Pabrik, kita entuk manawa ora kudu ngganti kelas sing wis ditulis sadurunge, nanging uga nalika ngembangake gambar (jinis) biksu, owah-owahan minimal ing kode dibutuhake. Ayo mriksa lan nambah kabeh pesenan lan jemaah biksu Katolik :) Nanging luwih becik fokus ing 3 sing paling misuwur, amarga ana luwih saka 100: 1) Benediktin 2) Jesuit 3) Fransiskan Kanggo nindakake iki, kaya sadurunge karo biksu Ortodoks, kita kudu ngleksanakake kelas tartamtu saka biksu Katulik:
public class CatholicMonk extends Monk {
    public CatholicMonk(String kind) {
        super(kind);
    }

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

    @Override
    protected Monk createMonk(String type) {
        return new CatholicMonk(type);
    }
}
lan mriksa kode:
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();
    }
}
Я православный монах - Мантийный монах
Я православный монах - Великосхимник
Я католический монах - Бенедиктинец
Я католический монах - Иезуит
Я католический монах - Францисканец
Ayo rampung karo pola iki. Kabeh jinis wiku iki uga bisa ditambahake menyang kelas E-num ing advance, nanging kanggo menakake kode kita bakal nindakake tanpa iku. Iku wektu kanggo pola Pabrik Abstrak. Kita duwe biksu, saiki kita bisa nggawe sandhangan, rosario, lsp. Ayo miwiti nganggo sandhangan, yaiku, yen kita bali menyang definisi ing wiwitan, sandhangan bakal dadi kulawarga obyek sing saling gegandhengan utawa saling gumantung . Ayo dadi miwiti karo masalah sing saben jinis wiku duwe jubah beda. Yen kita uga nambahake Buddha, mula bakal beda banget :) Kanggo nindakake iki, kita bisa nggawe antarmuka pabrik, implementasine bakal nggawe sandhangan sing dibutuhake. Mulane A) Kita nggawe pabrik kanggo nggawe sandhangan
public interface MonkFactory {
    Clothing createClothing();
}
lan implementasine
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();
    }
}
Inggih, aja lali babagan para biksu Buddha :)
public class BuddhistMonkFactory implements MonkFactory {

    @Override
    public Clothing createClothing() {
        return new BuddhistClothing();
    }
}
B) Nggawe kelas busana (kanggo nyederhanakake, ayo njupuk unsur kunci saka sandhangan biksu, kita ora bakal rinci):
public abstract class Clothing {
    private String name;

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

    public String getName() {
        return name;
    }
}
lan kelas anak
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) Sabanjure, kita ngganti kelas para bhikkhu supaya padha duwe sandhangan:
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) Kelas biara ngemot metode Pabrik kita
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);
}
implementasine kita ora diganti
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) Priksa asil:
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();
    }
}
Я православный монах - Мантийный монах
Моя одежда - Мантия
Я католический монах - Иезуит
Моя одежда - Ряса с капюшоном
Я англиканский монах - Бенедиктинец
Моя одежда - Ряса
Я буддийский монах - Монах
Моя одежда - Кашая
Pabrik sing nggawe klambi wis mulai kerja apik. Saiki sampeyan bisa nambah produksi peralatan kanggo biksu kanggo pandonga sukses (manik rosary, etc.). Nanging pitakonan isih tetep, apa bisa nggunakake 2 pola bebarengan? Mesthi wae sampeyan bisa :) Ayo nyoba nggawe versi pungkasan proyek kita lan nambahake biksu Hindu: A) Pabrik saiki nggawe wiku kaya "pabrik bintang" :
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) Kelas biara + implementasi konkrit saka kelas Biara ora dibutuhake, dileksanakake dening pabrik (sabalikna, kita bisa ninggalake lan mbusak pabrik-pabrik kasebut, nanging sejatine mung bakal dadi pabrik, mung ing kasus iki Biara banjur kudu digawe antarmuka, lan ora kelas abstrak). Lan nambah kelas aplikasi:
public class Application {

    public Monk create(MonkFactory monkFactory, String type) {
        Monk monk = monkFactory.createMonk(type);
        monk.prepare(monkFactory);
        return monk;
    }
}
B) Biku saiki ngemot
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);
}
ngemot metode pabrik ing implementasine, sing diimplementasikake nggunakake pabrik:
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) Lan ayo mriksa:
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();
    }
}
Я православный монах - Мантийный монах
Моя одежда - Мантия
Я католический монах - Иезуит
Моя одежда - Ряса с капюшоном
Я англиканский монах - Бенедиктинец
Моя одежда - Ряса
Я буддийский монах - Монах
Моя одежда - Кашая
Я индуистский монах - Саньяси
Моя одежда - Почти ничего, тепло же :)
Ing kesimpulan, sampeyan bisa nyathet yen metode Pabrik nggunakake kelas abstrak kanthi metode sing ora ditindakake, sing diimplementasikake ing subkelas, lan Pabrik Abstrak nggunakake antarmuka, ing ngendi implementasine (ing kasus kita, nggawe biarawan) dumadi ing kelas sing dileksanakake. antarmuka iki.
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION