JavaRush /Блоги Java /Random-TG /Усули завод ва намунаҳои абстрактии фабрика

Усули завод ва намунаҳои абстрактии фабрика

Дар гурӯҳ нашр шудааст
Дар китоби «Аввал сар. Тарҳҳои тарҳрезӣ" ин қолабҳоро ба таври зерин муайян мекунад: Намунаи Усули Фабрика интерфейсро барои сохтани an object муайян мекунад, аммо ба зерсинфҳо имкон медиҳад, ки синфи мисоли сохташавандаро интихоб кунанд. Ҳамин тариқ, усули Фабрика амалиёти инстансияро ба зерсинфҳо вогузор мекунад. Намунаи Abstract Factory интерфейсро барои эҷоди оилаҳои an objectҳои ба ҳам алоқаманд ё вобаста бидуни муайян кардани синфҳои мушаххаси онҳо таъмин мекунад. Биёед кӯшиш кунем, ки инро муфассалтар фаҳмем. Фарз мекунем, ки шумо қарор додед, ки дар бораи одамоне, ки тасмим гирифтанд, ки... (дар ин ҷо ба шумо чизи аслӣ ва ғайриоддӣ лозим аст) роҳибон шудан бозӣ нависед. Мо метавонем бо зерин оғоз кунем. 1) Синфи Монк ва синфҳои кӯдакона эҷод кунед (биёед аввал якро эҷод кунем):
public abstract class Monk {

    public abstract void description();
}
public class OrthodoxMonk extends Monk {
    @Override
    public void description() {
        System.out.println("Я православный монах");
    }
}
2) Ва албатта, як синфи Монастир эҷод кунед, ки дар он шумо метавонед "қасди монастырӣ" -ро иҷро кунед:
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();
    }
}
Я православный монах
Ҳоло, агар ба шумо лозим аст, ки ... як роҳиби католикӣ эҷод кунед, ба шумо лозим меояд, ки A) Барои як роҳиби католикӣ синфи нав эҷод кунед:
public class CatholicMonk extends Monk {
    @Override
    public void description() {
        System.out.println("Я католический монах");
    }
}
B) Ба синфи дайр тағйирот ворид кунед:
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;
    }
}
ва аз ин рӯ, ҳар дафъае, ки намудҳои нави роҳибон ҷорӣ карда мешаванд, шумо бояд синфи нав эҷод кунед ва синфи мавҷударо таҳрир кунед. Дар ин ҳолат чӣ кор кардан мумкин аст, то синфи дайри моро аз тағирот ба таври "инкапсулатсия" кунад. Шумо метавонед намунаи Усули Фабрикаро истифода баред. Он чӣ гуна хоҳад буд A) Биёед синфи роҳибонро ҳамон тавр тарк кунем, ба истиснои шояд як роҳиби англиканро илова кунем (на танҳо католикҳо ва масеҳиёни православӣ монастизм доранд):
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) Синфи дайрро ба таври зайл тагйир дихем (биёед онро ва усули онро реферат кунем). Дар ин ҷо мо танҳо усули Фабрикаро истифода мебарем:
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();
    }
}
B) Биёед codeро тафтиш кунем
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();
    }
}
Я православный монах
Я католический монах
Я англиканский монах
Онхое. чунон ки мо хозир мебинем, хангоми илова кардани навъхои нави рохибон зарурати тагйир додани синфхои мавчуда намемонад, балки танхо дар сурати зарурат синфхои навро (синфи дайр ва рохибони мушаххас) илова кунед. Шояд касе аллакай пай бурда бошад, ки усули тавсиф, ки аз ибтидо дар синфи Monk буд, низ Фабрика буд :) Дар таърифи усули завод гуфта шудааст, ки намунаи мо интерфейси сохтани an objectро муайян мекунад, аммо мо ҳеҷ гуна онро наофаридем. интерфейсҳо, гарчанде ки мо метавонем синфи Monastery-ро ҳамчун интерфейс эҷод кунем ва онро дар татбиқи мушаххас татбиқ кунем. Ин ба маънои васеътар ба калимаи "интерфейс" дахл дорад. Таъриф инчунин гуфт, ки он ба зерсинфҳо имкон медиҳад, ки синфи мисоли эҷодкардаи худро интихоб кунанд . Дар ин ҷо мо танҳо мебинем, ки зерсинфҳо (синфҳои кӯдакона) ин усулро амалӣ мекунанд (яъне ин ваколатҳо барои сохтани an objectҳои роҳибон ба онҳо дода шудаанд). Акнун биёед барномаи худро каме васеъ кунем, имкони дар ин ё он мазҳаб мавҷуд будани роҳибони гуногунро муаррифӣ кунем. Масалан, дар православӣ, дар асоси мавқеъи калисои православӣ оид ба дайрҳо ва монастирҳо (дар Шӯрои епископҳои калисои православии Рус аз 29 ноябр - 2 декабри соли 2017 қабул карда шудааст), мо метавонем ба хулосае ояд, ки 2 намуди роҳибон вуҷуд доранд. : - Схемаи хурдтар (мантия). - Схема (схемаи бузург). Инчунин «марҳилаҳои тайёрӣ» вуҷуд доранд, аммо одамонро роҳибон ҳисоб намекунанд (Трудник, Новиц ва Рясофор ё Монк), зеро онҳо савгандҳои монастырӣ намегиранд. Бинобар ин мо онхоро ба назар намегирем. Дар ин ҳолат мо чӣ ба даст меорем: A) Синфи монастир (барои содда кардан, биёед ҳоло ба монастизми православӣ тамаркуз кунем) бо усули заводӣ :
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);
    }
}
B) Биёед синфи роҳибонро ислоҳ кунем:
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);
    }
}
C) Биёед рамзи худро тафтиш кунем:
public class Main {
    public static void main(String[] args) {
        Monastery monastery = new OrthodoxMonastery();
        monastery.createMonk("Мантийный монах").description();
        monastery.createMonk("Великосхимник").description();
    }
}
Я православный монах - Мантийный монах
Я православный монах — Великосхимник
Ҳамин тариқ, бо истифода аз намунаи Усули Фабрика, мо ба он ноил шудем, ки мо набояд синфҳои қаблан навишташударо тағир диҳем, аммо ҳангоми васеъ кардани тасвирҳои (намудҳои) роҳибон ҳадди аққал тағирот дар code талаб карда мешавад. Биёед ҳама фармонҳо ва ҷамъомадҳои роҳибони католикиро тафтиш ва илова кунем :) Аммо беҳтар аст, ки ба 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);
    }
}
ва codeро тафтиш кунед:
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 илова кард, аммо барои содда кардани code мо бе ин кор мекунем. Вақти он расидааст, ки намунаи абстрактии завод. Мо роҳибон дорем, акнун метавонистем ба онҳо либос, тасбеҳ ва ғайра созем. Биёед аз либос оғоз кунем, яъне агар мо дар аввал ба таърифи худ баргардем, либос ба як оилаи an objectҳои ба ҳам алоқаманд ё вобастагӣ табдил меёбад . Биёед аз мушкилоте оғоз кунем, ки ҳар як роҳибон ҷомаҳои гуногун доранд. Агар мо низ буддоӣ илова кунем, он гоҳ онҳо комилан дигар хоҳанд шуд :) Барои ин, мо метавонем интерфейси заводро эҷод кунем, ки татбиқи он либосҳои заруриро эҷод мекунад. Аз ин рӯ, A) Мо як корхонаи истеҳсоли либос эҷод мекунем
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();
    }
}
B) Синфи либос эҷод кунед (барои содда кардан, биёед унсури асосии либоси роҳибонро гирем, мо ба тафсилот намеравем):
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("Кашая");
    }
}
C) Баъдан, мо синфҳои роҳибонро иваз мекунем, то онҳо либос дошта бошанд:
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) Синфи дайр усули Фабрикаи моро дар бар мегирад
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);
    }
}
D) Натиҷаро тафтиш кунед:
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 намунаро якҷоя истифода бурдан мумкин аст? Албатта, шумо метавонед :) Биёед кӯшиш кунем, ки versionи ниҳоии лоиҳаи худро созем ва як роҳиби ҳиндуро илова кунем: A) Ҳоло заводҳо роҳибон эҷод мекунанд, ба мисли "фабрикаи ситораҳо" садо медиҳанд :
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) Синфи дайр + амалисозии мушаххаси синфи Монастир лозим нест, онҳо аз ҷониби завод амалӣ карда мешаванд (баръакс, мо метавонем онҳоро тарк карда, заводҳоро хориҷ кунем, аммо дар асл онҳо ба ҷои заводҳо мебуданд, танҳо дар Дар ин ҳолат, монастир бояд интерфейс сохта шавад, на синфи абстрактӣ). Ва синфи барномаро илова кунед:
public class Application {

    public Monk create(MonkFactory monkFactory, String type) {
        Monk monk = monkFactory.createMonk(type);
        monk.prepare(monkFactory);
        return monk;
    }
}
B) Роҳибҳо ҳоло дар бар мегиранд
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());
    }
}
D) Ва биёед тафтиш кунем:
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();
    }
}
Я православный монах - Мантийный монах
Моя одежда - Мантия
Я католический монах - Иезуит
Моя одежда - Ряса с капюшоном
Я англиканский монах - Бенедиктинец
Моя одежда - Ряса
Я буддийский монах - Монах
Моя одежда - Кашая
Я индуистский монах - Саньяси
Моя одежда - Почти ничего, тепло же :)
Хулоса, шумо метавонед қайд кунед, ки усули Фабрика як синфи абстрактиро бо усули иҷронашуда, ки дар зерсинфҳо амалӣ карда шуда буд, истифода мебурд ва Фабрикаи абстрактӣ интерфейсеро истифода мебурд, ки дар он татбиқ (дар ҳолати мо, эҷоди як роҳиб) дар синфҳое сурат гирифтааст, ки ин интерфейс.
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION