JavaRush /جاوا بلاگ /Random-UR /فیکٹری کا طریقہ اور خلاصہ فیکٹری پیٹرن

فیکٹری کا طریقہ اور خلاصہ فیکٹری پیٹرن

گروپ میں شائع ہوا۔
کتاب میں "ہیڈ فرسٹ۔ ڈیزائن پیٹرنز" ان نمونوں کی وضاحت اس طرح کرتا ہے: فیکٹری میتھڈ پیٹرن کسی چیز کو بنانے کے لیے انٹرفیس کی وضاحت کرتا ہے، لیکن ذیلی طبقات کو تخلیق کرنے کے لیے مثال کی کلاس کا انتخاب کرنے کی اجازت دیتا ہے۔ اس طرح، فیکٹری کا طریقہ انسٹیٹیوشن آپریشن کو ذیلی طبقات کو سونپتا ہے۔ خلاصہ فیکٹری پیٹرن ان کی کنکریٹ کلاسوں کی وضاحت کیے بغیر باہم منسلک یا باہم منحصر اشیاء کے خاندانوں کو بنانے کے لیے ایک انٹرفیس فراہم کرتا ہے۔ آئیے اس کو مزید تفصیل سے سمجھنے کی کوشش کرتے ہیں۔ مان لیں کہ آپ ان لوگوں کے بارے میں ایک گیم لکھنے کا فیصلہ کرتے ہیں جو راہب بننے کا فیصلہ کرتے ہیں... (آپ کو یہاں اصل اور غیر معمولی چیز کی ضرورت ہے) راہب۔ ہم مندرجہ ذیل کے ساتھ شروع کر سکتے ہیں. 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("Я католический монах");
    }
}
ب) خانقاہ کی کلاس میں تبدیلیاں کریں:
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("Я англиканский монах");
    }
}
ب) آئیے خانقاہ کی کلاس کو اس طرح تبدیل کریں (آئیے اسے اور اس کا طریقہ خلاصہ بنائیں)۔ یہاں ہم صرف فیکٹری کا طریقہ استعمال کرتے ہیں:
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();
    }
}
Я православный монах
Я католический монах
Я англиканский монах
وہ. جیسا کہ ہم اب دیکھ رہے ہیں، نئی قسم کے راہبوں کو شامل کرتے وقت، موجودہ کلاسوں کو تبدیل کرنے کی ضرورت نہیں ہوگی، لیکن اگر ضروری ہو تو، نئی (ایک مخصوص خانقاہ اور راہب کی کلاس) شامل کریں۔ شاید کسی نے پہلے ہی محسوس کیا ہو کہ وضاحت کا طریقہ، جو مانک کلاس میں شروع سے تھا، فیکٹری بھی تھا :) فیکٹری کے طریقہ کار کی تعریف میں کہا گیا ہے کہ ہمارا پیٹرن کسی چیز کو بنانے کے لیے انٹرفیس کی وضاحت کرتا ہے، لیکن ہم نے کوئی تخلیق نہیں کیا۔ انٹرفیس، اگرچہ ہم Monastery کلاس کو ایک انٹرفیس کے طور پر بنا سکتے ہیں اور اسے مخصوص نفاذ میں لاگو کر سکتے ہیں۔ اس سے مراد وسیع تر معنوں میں لفظ "انٹرفیس" ہے۔ تعریف میں یہ بھی کہا گیا ہے کہ یہ ذیلی طبقات کو اپنی تخلیق کردہ مثال کی کلاس کا انتخاب کرنے کی اجازت دیتا ہے ۔ یہاں ہم صرف یہ دیکھتے ہیں کہ ذیلی طبقات (چائلڈ کلاسز) اس طریقہ کو نافذ کرتے ہیں (یعنی راہب اشیاء بنانے کے اختیارات ان کے سپرد ہوتے ہیں)۔ اب آئیے اپنے پروگرام کو تھوڑا سا بڑھاتے ہیں، اس امکان کو متعارف کراتے ہیں کہ ایک یا دوسرے فرقے میں مختلف راہب موجود ہیں۔ مثال کے طور پر، آرتھوڈوکس میں، خانقاہوں اور خانقاہوں پر آرتھوڈوکس چرچ کے موقف کی بنیاد پر (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);
    }
}
ب) آئیے راہب کلاس کو ٹھیک کریں:
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();
    }
}
Я православный монах - Мантийный монах
Я православный монах — Великосхимник
اس طرح، فیکٹری میتھڈ پیٹرن کا استعمال کرتے ہوئے، ہم نے یہ حاصل کیا کہ ہمیں پہلے سے لکھی گئی کلاسوں کو تبدیل کرنے کی ضرورت نہیں ہے، بلکہ راہبوں کی تصویروں (قسموں) کو پھیلاتے وقت، کوڈ میں کم از کم تبدیلیوں کی ضرورت ہے۔ آئیے چیک کریں اور کیتھولک راہبوں کے تمام احکامات اور اجتماعات کو شامل کریں :) لیکن 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 کلاس میں بھی شامل کیا جا سکتا ہے، لیکن کوڈ کو آسان بنانے کے لیے ہم اس کے بغیر کریں گے۔ یہ خلاصہ فیکٹری پیٹرن کے لئے وقت ہے. ہمارے پاس راہب ہیں، اب ہم انہیں کپڑے، مالا وغیرہ بنا سکتے ہیں۔ آئیے لباس سے شروع کرتے ہیں، یعنی اگر ہم شروع میں اپنی تعریف کی طرف لوٹتے ہیں، تو لباس ایک دوسرے سے جڑے ہوئے یا ایک دوسرے پر منحصر اشیاء کا خاندان بن جائے گا۔ آئیے اس مسئلے سے شروع کرتے ہیں کہ ہر قسم کے راہب کے لباس مختلف ہوتے ہیں۔ اگر ہم بدھ مت کو بھی شامل کریں، تو وہ بالکل مختلف ہوں گے :) ایسا کرنے کے لیے، ہم ایک فیکٹری انٹرفیس بنا سکتے ہیں، جس کے نفاذ سے ضروری کپڑے تیار ہوں گے۔ لہذا 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();
    }
}
ب) لباس کی کلاس بنائیں (آسان بنانے کے لیے، راہبوں کے لباس کے کلیدی عنصر کو لیتے ہیں، ہم تفصیل میں نہیں جائیں گے):
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 پیٹرن کو ایک ساتھ استعمال کرنا ممکن ہے؟ یقیناً آپ کر سکتے ہیں :) آئیے اپنے پروجیکٹ کا حتمی ورژن بنانے کی کوشش کریں اور ایک ہندو راہب کو شامل کریں: 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();
    }
}
ب) خانقاہ کلاس + خانقاہ کلاس کے ٹھوس نفاذ کی ضرورت نہیں ہے، وہ فیکٹری کے ذریعہ لاگو ہوتے ہیں (اس کے برعکس، ہم انہیں چھوڑ سکتے ہیں اور فیکٹریوں کو ہٹا سکتے ہیں، لیکن خلاصہ یہ ہے کہ وہ پھر فیکٹریوں کے بجائے، صرف اس صورت میں خانقاہ کو ایک انٹرفیس بنانا ہوگا، نہ کہ تجریدی کلاس)۔ اور درخواست کی کلاس شامل کریں:
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());
    }
}
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