CodeGym /جاوا بلاگ /Random-UR /فیکٹری ڈیزائن پیٹرن
John Squirrels
سطح
San Francisco

فیکٹری ڈیزائن پیٹرن

گروپ میں شائع ہوا۔
ہیلو دوست! آج ہم ڈیزائن کے نمونوں کا مطالعہ جاری رکھیں گے۔ اس سبق میں، ہم فیکٹریوں کے بارے میں بات کرنے جا رہے ہیں۔ ہم اس مسئلے پر بات کریں گے جسے یہ پیٹرن حل کرتا ہے اور ایک مثال دیکھیں گے کہ ایک فیکٹری آپ کو کافی شاپ کھولنے میں کس طرح مدد کر سکتی ہے۔ مزید برآں، میں آپ کو فیکٹری بنانے کے لیے 5 آسان اقدامات دوں گا۔ فیکٹری ڈیزائن پیٹرن - 1 اس بات کو یقینی بنانے کے لیے کہ ہم سب ایک ہی طول موج پر ہیں اور آپ اس تصور کو تیزی سے سمجھ لیں گے، آپ کو درج ذیل عنوانات سے واقف ہونا چاہیے:
  • جاوا میں وراثت
  • جاوا میں حوالہ کی اقسام کو تنگ اور چوڑا کرنا
  • مختلف طبقات اور اشیاء کے درمیان تعامل۔

فیکٹری کیا ہے؟

فیکٹری ڈیزائن پیٹرن آپ کو اشیاء کی تخلیق کو کنٹرول کرنے دیتا ہے۔ ایک نئی چیز بنانے کا عمل بہت آسان نہیں ہے، لیکن نہ ہی یہ بہت زیادہ پیچیدہ ہے۔ ہم سب جانتے ہیں کہ ہمیں newایک نئی چیز بنانے کے لیے آپریٹر کی ضرورت ہے۔ شاید ایسا لگتا ہے کہ یہاں کنٹرول کرنے کے لئے کچھ نہیں ہے، لیکن یہ سچ نہیں ہے. فرض کریں کہ ہماری درخواست میں ایک مخصوص طبقہ ہے جس کی کئی اولادیں ہیں۔ مشکلات اس وقت پیدا ہو سکتی ہیں جب بعض شرائط کے لحاظ سے مخصوص طبقے کی مثال بنانا ضروری ہو۔ فیکٹری ایک ڈیزائن کا نمونہ ہے جو کچھ شرائط کے مطابق مختلف اشیاء بنانے کے مسئلے کو حل کرنے میں مدد کرتا ہے۔ یہ ایک تجریدی تصور کے لیے کیسا ہے؟ جب ہم ذیل کی مثال کو دیکھیں گے تو یہ واضح اور زیادہ مخصوص ہو جائے گا۔

آئیے مختلف قسم کی کافی تیار کرتے ہیں۔

فرض کریں کہ ہم ایک کافی شاپ کو خودکار بنانا چاہتے ہیں۔ ہمیں اپنے پروگرام میں مختلف قسم کی کافی بنانے کا طریقہ سکھانے کی ضرورت ہے۔ ایسا کرنے کے لیے، ہم کافی کی ان اقسام کی نمائندگی کے لیے ایک کافی کلاس اور چند مشتق کلاسز بنائیں گے جو ہم تیار کریں گے: Americano، cappuccino، espresso، اور latte۔ آئیے ایک عام کافی کلاس کے ساتھ شروع کریں:

public class Coffee {
    public void grindCoffee(){
        // Grind the coffee
    }
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
اگلا، ہم اس کی چائلڈ کلاسز بنائیں گے:

public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
ہمارے صارفین کسی بھی قسم کی کافی کا آرڈر دے سکتے ہیں۔ ان کے احکامات کو پروگرام تک پہنچانے کی ضرورت ہے۔ یہ بہت سے طریقوں سے کیا جا سکتا ہے، مثال کے طور پر، استعمال کرتے ہوئے String. لیکن ایک enumاس کے لیے بہترین ہے۔ ہم ایک enumاینوم فیلڈز بنائیں گے اور اس کی وضاحت کریں گے جو کافی کی ان اقسام کے مطابق ہوں گے جنہیں آرڈر کیا جا سکتا ہے:

public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
زبردست. اب ہم اپنی کافی شاپ کا کوڈ لکھتے ہیں:

public class CoffeeShop {
    
    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;
        
        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
طریقہ orderCoffeeکار کو دو حصوں میں تقسیم کیا جا سکتا ہے:
  1. switchایک بیان میں کافی کی ایک مخصوص مثال کی تخلیق ۔ یہ وہ جگہ ہے جہاں ایک فیکٹری وہی کرتی ہے جو وہ کرتی ہے — حالات کے لحاظ سے ایک مخصوص قسم بنائیں۔
  2. تیاری - یہ پیسنے، پک، اور ایک کپ میں ڈالنا ہے.
اگر آپ کو مستقبل میں طریقہ کار میں تبدیلیاں کرنے کی ضرورت ہے تو یہ جاننا ضروری ہے:
  1. خود تیاری میں شامل اقدامات (پیسنے، پکنے، اور ایک کپ میں ڈالنے) میں کوئی تبدیلی نہیں ہوگی (کم از کم ہم اس پر اعتماد کر رہے ہیں)۔
  2. لیکن کافیوں کی درجہ بندی بدل سکتی ہے۔ شاید ہم موچا بنانا شروع کر دیں گے... فراپو... موچاکی... جو بھی ہو، ایک نئی قسم کی کافی۔
ہم پہلے ہی کافی پر اعتماد ہو سکتے ہیں کہ مستقبل میں ہمیں طریقہ کار کے switchبیان میں تبدیلیاں کرنی ہوں گی۔ یہ بھی ممکن ہے کہ ہماری کافی شاپ میں یہ orderCoffeeطریقہ واحد جگہ نہ ہو جہاں ہم مختلف قسم کی کافی بنائیں گے۔ اس کے نتیجے میں کئی جگہوں پر تبدیلیاں کرنا پڑیں گی۔ آپ شاید پہلے ہی سمجھ گئے ہوں کہ میں کیا حاصل کر رہا ہوں۔ ہمیں ری ایکٹر کرنے کی ضرورت ہے۔ کافی بنانے کے لیے ذمہ دار بلاک کو دو وجوہات کی بنا پر الگ کلاس میں منتقل کریں:
  1. ہم کافی بنانے والی منطق کو دوسری جگہوں پر دوبارہ استعمال کر سکتے ہیں۔
  2. اگر درجہ بندی بدل جاتی ہے، تو ہمیں ہر جگہ جہاں کافی بنائی جاتی ہے کوڈ میں ترمیم کرنے کی ضرورت نہیں پڑے گی۔ ہمارے کوڈ کو صرف ایک جگہ تبدیل کرنا کافی ہوگا۔
دوسرے لفظوں میں فیکٹری لگانے کا وقت آگیا ہے۔

ہماری پہلی فیکٹری قائم کرنا

ایسا کرنے کے لیے، ہم ایک نئی کلاس بنائیں گے جو صرف کافی کلاسز کی ضروری مثالیں بنانے کے لیے ذمہ دار ہو گی:

public class SimpleCoffeeFactory {
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }
        
        return coffee;
    }
}
مبارک ہو! ہم نے ابھی فیکٹری ڈیزائن پیٹرن کو اس کی آسان ترین شکل (تقریباً) میں نافذ کیا ہے۔ createCoffeeاگر ہم طریقہ کو جامد بنا دیتے تو یہ اور بھی آسان ہو سکتا تھا ۔ لیکن پھر ہم دو صلاحیتیں کھو دیں گے:
  1. SimpleCoffeeFactoryطریقہ کو وراثت اور اوور رائڈ کرنے کی صلاحیت createCoffee۔
  2. ہماری کلاسوں میں مطلوبہ فیکٹری کے نفاذ کو شامل کرنے کی صلاحیت۔
ویسے، نفاذ کی بات کرتے ہوئے... ہمیں کافی شاپ پر واپس جانا ہوگا اور اپنی کافی بنانے والی فیکٹری کو شامل کرنا ہوگا۔

کافی شاپ میں ایک فیکٹری شامل کرنا

آئیے ایک فیکٹری کا استعمال کرتے ہوئے کافی شاپ کلاس کو دوبارہ لکھتے ہیں:

public class CoffeeShop {

    private final SimpleCoffeeFactory coffeeFactory;

    public CoffeeShop(SimpleCoffeeFactory coffeeFactory) {
        this.coffeeFactory = coffeeFactory;
    }

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = coffeeFactory.createCoffee(type);
        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
بہترین اب ہم فیکٹری ڈیزائن پیٹرن کے عمومی ڈھانچے کی ایک جامع وضاحت فراہم کریں گے۔

اپنی فیکٹری کھولنے کے لیے 5 اقدامات

مرحلہ 1۔ آپ کے پروگرام میں کئی اولادوں کے ساتھ ایک کلاس ہے، جیسا کہ نیچے دی گئی تصویر میں ہے: فیکٹری ڈیزائن پیٹرن - 2مرحلہ 2۔ آپ enumہر چائلڈ کلاس کے لیے ایک فیلڈ کے ساتھ بناتے ہیں:

    enum CatType {
        LION,
        TIGER,
        FLUFFY
    }
مرحلہ 3۔ اپنی فیکٹری بنائیں۔ اسے بلاؤ CatFactory۔ یہ کوڈ ہے:

class CatFactory {}
مرحلہ 4۔ اپنی فیکٹری میں، ایک ایسا createCatطریقہ بنائیں جو CatTypeدلیل لے۔ یہ کوڈ ہے:

    class CatFactory {
        public Cat createCat(CatType type) {
            
        }
    }
مرحلہ 5۔ طریقہ کار کے باڈی میں، ایک switchبیان لکھیں جو enum فیلڈز کو شمار کرتا ہے اور کلاس کی ایک مثال بناتا ہے جو پاس شدہ enumقدر سے مطابقت رکھتا ہے:

class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;
            
            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }
            
            return cat;
        }
    }
اب آپ باس کی طرح فیکٹری چلا سکتے ہیں۔ :)

مشق کرنے کا طریقہ

پڑھنا اچھا ہے، لکھنا کوڈ بھی بہتر ہے۔ اگر آپ کے نام میں حروف کی تعداد یکساں ہے، تو اپنا ورچوئل پزیریا بنانے کی کوشش کریں۔ اگر آپ کے نام میں طاق تعداد میں حروف ہیں تو ورچوئل سشی بار بنانے کی کوشش کریں۔ اگر آپ کا کوئی نام نہیں ہے تو آپ خوش قسمت ہیں۔ آج آپ آرام کر سکتے ہیں۔
تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION