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

ڈیزائن پیٹرن: فیکٹری کا طریقہ

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

فیکٹری کا طریقہ کیا مسئلہ حل کرتا ہے؟

تمام فیکٹری ڈیزائن پیٹرن میں دو قسم کے شرکاء ہوتے ہیں: تخلیق کار (خود کارخانے) اور مصنوعات (فیکٹریوں کی تخلیق کردہ اشیاء)۔ مندرجہ ذیل صورتحال کا تصور کریں: ہمارے پاس ایک فیکٹری ہے جو کوڈ جیم برانڈڈ کاریں تیار کرتی ہے۔ یہ مختلف قسم کے جسموں کے ساتھ کاروں کے ماڈل بنانے کا طریقہ جانتا ہے:
  • سیڈان
  • اسٹیشن ویگنیں
  • coupes
ہمارے کاروبار میں اتنی ترقی ہوئی کہ ایک اچھے دن ہم نے ایک اور کار ساز کمپنی - OneAuto کو حاصل کیا۔ سمجھدار کاروباری مالکان ہونے کے ناطے، ہم OneAuto کے کسی بھی کسٹمر کو کھونا نہیں چاہتے، اور اس لیے ہمیں پروڈکشن کی تنظیم نو کا کام درپیش ہے تاکہ ہم پیداوار کر سکیں:
  • کوڈ جیم سیڈان
  • کوڈ جیم اسٹیشن ویگن
  • کوڈ جیم کوپس
  • OneAuto سیڈان
  • ون آٹو اسٹیشن ویگن
  • OneAuto کوپس
جیسا کہ آپ دیکھ سکتے ہیں، مصنوعات کے ایک گروپ کے بجائے، اب ہمارے پاس دو ہیں، اور وہ کچھ تفصیلات میں مختلف ہیں۔ فیکٹری میتھڈ ڈیزائن پیٹرن اس وقت کے لیے ہے جب ہمیں پروڈکٹس کے مختلف گروپس بنانے کی ضرورت ہوتی ہے، جن میں سے ہر ایک میں کچھ خاص خصوصیات ہوتی ہیں۔ ہم اپنی کافی شاپ کی مثال کو استعمال کرتے ہوئے، جو ہم نے پچھلے اسباق میں سے ایک میں تخلیق کیا تھا، ہم عملی طور پر اس پیٹرن کے رہنما اصول پر غور کریں گے ۔

فیکٹری پیٹرن کے بارے میں تھوڑا سا

میں آپ کو یاد دلاتا ہوں کہ ہم نے پہلے ایک چھوٹی سی ورچوئل کافی شاپ بنائی تھی۔ ایک سادہ فیکٹری کی مدد سے، ہم نے کافی کی مختلف اقسام بنانے کا طریقہ سیکھا۔ آج ہم اس مثال پر دوبارہ کام کریں گے۔ آئیے یاد کرتے ہیں کہ ہماری کافی شاپ اپنی سادہ فیکٹری کے ساتھ کیسی لگتی تھی۔ ہماری کافی کلاس تھی:
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 {}
ہم نے آرڈر دینے میں آسانی پیدا کرنے کے لیے ایک اینوم بنایا:
public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
کافی فیکٹری خود اس طرح نظر آتی تھی:
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 Cappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        return coffee;
    }
}
اور آخر کار، کافی شاپ خود اس طرح نظر آئی:
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;
    }
}

ایک سادہ فیکٹری کو جدید بنانا

ہماری کافی شاپ بہت اچھی چل رہی ہے۔ اتنا کہ ہم توسیع پر غور کر رہے ہیں۔ ہم کچھ نئے مقامات کھولنا چاہتے ہیں۔ ہم بولڈ اور انٹرپرائزنگ ہیں، اس لیے ہم بورنگ کافی شاپس کو کرینک نہیں کریں گے۔ ہم چاہتے ہیں کہ ہر دکان میں ایک خاص موڑ ہو۔ اس کے مطابق، شروع کرنے کے لیے، ہم دو مقامات کھولیں گے: ایک اطالوی اور ایک امریکی۔ یہ تبدیلیاں نہ صرف اندرونی ڈیزائن بلکہ پیش کیے جانے والے مشروبات کو بھی متاثر کریں گی۔
  • اطالوی کافی شاپ میں، ہم خصوصی طور پر اطالوی کافی برانڈز استعمال کریں گے، خصوصی پیسنے اور بھوننے کے ساتھ۔
  • امریکی مقام کے بڑے حصے ہوں گے، اور ہم ہر آرڈر کے ساتھ مارشمیلو پیش کریں گے۔
صرف ایک چیز جو بدستور باقی ہے وہ ہمارا کاروباری ماڈل ہے، جس نے خود کو بہترین ثابت کیا ہے۔ کوڈ کے لحاظ سے، ایسا ہی ہوتا ہے۔ ہمارے پاس ہماری مصنوعات کے مطابق 4 کلاسیں تھیں:
public class Americano extends Coffee {}
public class Cappuccino extends Coffee {}
public class CaffeLatte extends Coffee {}
public class Espresso extends Coffee {}
لیکن اب ہمارے پاس 8 ہوں گے:
public class ItalianStyleAmericano extends Coffee {}
public class ItalianStyleCappucino extends Coffee {}
public class ItalianStyleCaffeLatte extends Coffee {}
public class ItalianStyleEspresso extends Coffee {}

public class AmericanStyleAmericano extends Coffee {}
public class AmericanStyleCappucino extends Coffee {}
public class AmericanStyleCaffeLatte extends Coffee {}
public class AmericanStyleEspresso extends Coffee {}
چونکہ ہم موجودہ کاروباری ماڈل کو برقرار رکھنا چاہتے ہیں، ہم چاہتے ہیں کہ orderCoffee(CoffeeType type)طریقہ کار میں ممکنہ حد تک کم تبدیلیاں کی جائیں۔ اس پر ایک نظر ڈالیں:
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;
}
ہمارے پاس کیا اختیارات ہیں؟ ٹھیک ہے، ہم پہلے ہی جانتے ہیں کہ فیکٹری کیسے لکھنا ہے، ٹھیک ہے؟ سب سے آسان چیز جو فوری طور پر ذہن میں آتی ہے وہ ہے دو ملتے جلتے کارخانوں کو لکھنا، اور پھر مطلوبہ عمل کو ہمارے کافی شاپ کے کنسٹرکٹر کو منتقل کرنا ہے۔ ایسا کرنے سے کافی شاپ کی کلاس نہیں بدلے گی۔ سب سے پہلے، ہمیں ایک نئی فیکٹری کلاس بنانے کی ضرورت ہے، اسے اپنی سادہ فیکٹری کا وارث بنانا، اور پھر createCoffee(CoffeeType type)طریقہ کو اوور رائڈ کرنا ہوگا۔ آئیے اطالوی طرز کی کافی اور امریکی طرز کی کافی بنانے کے لیے فیکٹریاں لکھتے ہیں:
public class SimpleItalianCoffeeFactory extends SimpleCoffeeFactory {

    @Override
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;
        switch (type) {
            case AMERICANO:
                coffee = new ItalianStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new ItalianStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new ItalianStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new ItalianStyleCaffeLatte();
                break;
        }
        return coffee;
    }
}

public class SimpleAmericanCoffeeFactory extends SimpleCoffeeFactory{

    @Override
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new AmericanStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new AmericanStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new AmericanStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new AmericanStyleCaffeLatte();
                break;
        }

        return coffee;
    }

}
اب ہم مطلوبہ فیکٹری کے نفاذ کو کافی شاپ تک پہنچا سکتے ہیں۔ آئیے دیکھتے ہیں کہ مختلف کافی شاپس سے کافی آرڈر کرنے کا کوڈ کیسا ہوگا۔ مثال کے طور پر، اطالوی طرز اور امریکی طرز کیپوچینو:
public class Main {
    public static void main(String[] args) {
        /*
            Order an Italian-style cappuccino:
            1. Create a factory for making Italian coffee
            2. Create a new coffee shop, passing the Italian coffee factory to it through the constructor
            3. Order our coffee
         */
        SimpleItalianCoffeeFactory italianCoffeeFactory = new SimpleItalianCoffeeFactory();
        CoffeeShop italianCoffeeShop = new CoffeeShop(italianCoffeeFactory);
        italianCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);


         /*
            Order an American-style cappuccino
            1. Create a factory for making American coffee
            2. Create a new coffee shop, passing the American coffee factory to it through the constructor
            3. Order our coffee
         */
        SimpleAmericanCoffeeFactory americanCoffeeFactory = new SimpleAmericanCoffeeFactory();
        CoffeeShop americanCoffeeShop = new CoffeeShop(americanCoffeeFactory);
        americanCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);
    }
}
ہم نے دو مختلف کافی شاپس بنائیں، ہر ایک کو مطلوبہ فیکٹری منتقل کر دی۔ ایک طرف، ہم نے اپنا مقصد پورا کر لیا ہے، لیکن دوسری طرف... کسی نہ کسی طرح یہ کاروباری حضرات کے لیے ٹھیک نہیں ہے... آئیے معلوم کریں کہ کیا غلط ہے۔ سب سے پہلے، فیکٹریوں کی کثرت. کیا؟ اب ہر نئی جگہ کے لیے، ہمیں اس کی اپنی فیکٹری بنانے کی ضرورت ہے اور اس کے علاوہ، اس بات کو یقینی بنانا ہے کہ کافی شاپ بناتے وقت متعلقہ فیکٹری کو کنسٹرکٹر کو دیا جائے؟ دوسرا، یہ اب بھی ایک سادہ فیکٹری ہے. بس تھوڑا سا جدید بنایا۔ لیکن ہم یہاں ایک نیا نمونہ سیکھنے آئے ہیں۔ تیسرا، کیا ایک مختلف نقطہ نظر ممکن نہیں ہے؟ یہ بہت اچھا ہو گا اگر ہم کافی کی تیاری سے متعلق تمام مسائل کو کلاس میں کافی بنانے اور سروسنگ آرڈرز کو جوڑنے کے ساتھ ساتھ کافی کے مختلف اسٹائل بنانے کے لیے کافی لچک برقرار رکھتے ہوئے شامل کر سکیں CoffeeShop۔ جواب ہے ہاں، ہم کر سکتے ہیں۔ اسے فیکٹری طریقہ ڈیزائن پیٹرن کہا جاتا ہے۔

ایک سادہ فیکٹری سے فیکٹری کے طریقہ کار تک

کام کو ہر ممکن حد تک مؤثر طریقے سے حل کرنے کے لیے:
  1. ہم createCoffee(CoffeeType type)طریقہ کو کلاس میں واپس کرتے ہیں CoffeeShop۔
  2. ہم اس طریقہ کو خلاصہ بنائیں گے۔
  3. کلاس CoffeeShopخود ہی خلاصہ بن جائے گی۔
  4. کلاس CoffeeShopمیں بچوں کی کلاسیں ہوں گی۔
ہاں دوست. اطالوی کافی شاپ اس طبقے کی نسل سے زیادہ کچھ نہیں ہے CoffeeShop، جو اس createCoffee(CoffeeType type)طریقہ کو اطالوی بارسٹاس کی بہترین روایات کے مطابق نافذ کرتی ہے۔ اب، ایک وقت میں ایک قدم۔ مرحلہ 1۔ Coffeeکلاس کو خلاصہ بنائیں۔ ہمارے پاس مختلف مصنوعات کے دو پورے خاندان ہیں۔ پھر بھی، اطالوی اور امریکی کافیوں کا ایک مشترکہ اجداد ہے - کلاس Coffee۔ اسے خلاصہ بنانا مناسب ہوگا:
public abstract class Coffee {
    public void makeCoffee(){
        // Brew the coffee
    }
    public void pourIntoCup(){
        // Pour into a cup
    }
}
مرحلہ 2۔ CoffeeShopتجریدی createCoffee(CoffeeType type)طریقہ کے ساتھ خلاصہ بنائیں
public abstract class CoffeeShop {

    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = createCoffee(type);

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

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }

    protected abstract Coffee createCoffee(CoffeeType type);
}
مرحلہ 3۔ ایک اطالوی کافی شاپ بنائیں، جو خلاصہ کافی شاپ کی نسل ہے۔ ہم createCoffee(CoffeeType type)اطالوی ترکیبوں کی تفصیلات کو مدنظر رکھتے ہوئے اس میں طریقہ کار کو نافذ کرتے ہیں۔
public class ItalianCoffeeShop extends CoffeeShop {

    @Override
    public Coffee createCoffee (CoffeeType type) {
        Coffee coffee = null;
        switch (type) {
            case AMERICANO:
                coffee = new ItalianStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new ItalianStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new ItalianStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new ItalianStyleCaffeLatte();
                break;
        }
        return coffee;
    }
}
مرحلہ 4۔ ہم امریکی طرز کی کافی شاپ کے لیے بھی ایسا ہی کرتے ہیں۔
public class AmericanCoffeeShop extends CoffeeShop {
    @Override
    public Coffee createCoffee(CoffeeType type) {
        Coffee coffee = null;

        switch (type) {
            case AMERICANO:
                coffee = new AmericanStyleAmericano();
                break;
            case ESPRESSO:
                coffee = new AmericanStyleEspresso();
                break;
            case CAPPUCCINO:
                coffee = new AmericanStyleCappuccino();
                break;
            case CAFFE_LATTE:
                coffee = new AmericanStyleCaffeLatte();
                break;
        }

        return coffee;
    }
}
مرحلہ 5۔ چیک کریں کہ امریکی اور اطالوی لیٹیں کیسی نظر آئیں گی:
public class Main {
    public static void main(String[] args) {
        CoffeeShop italianCoffeeShop = new ItalianCoffeeShop();
        italianCoffeeShop.orderCoffee(CoffeeType.CAFFE_LATTE);

        CoffeeShop americanCoffeeShop = new AmericanCoffeeShop();
        americanCoffeeShop.orderCoffee(CoffeeType.CAFFE_LATTE);
    }
}
مبارک ہو ہم نے صرف اپنی کافی شاپ کو مثال کے طور پر استعمال کرتے ہوئے فیکٹری میتھڈ ڈیزائن پیٹرن کو نافذ کیا۔

فیکٹری طریقوں کے پیچھے اصول

اب آئیے مزید تفصیل سے غور کریں کہ ہمیں کیا ملا۔ نیچے دیا گیا خاکہ نتیجہ خیز کلاسز کو دکھاتا ہے۔ سبز بلاکس تخلیق کار کلاسز ہیں، اور نیلے بلاکس پروڈکٹ کلاسز ہیں۔ ڈیزائن پیٹرن: فیکٹری طریقہ - 2ہم کیا نتیجہ اخذ کر سکتے ہیں؟
  1. تمام پروڈکٹس خلاصہ Coffeeکلاس کے نفاذ ہیں۔
  2. تمام تخلیق کار تجریدی CoffeeShopطبقے کے نفاذ ہیں۔
  3. ہم دو متوازی طبقاتی درجہ بندی دیکھتے ہیں:
    • مصنوعات کا درجہ بندی۔ ہم اطالوی اولاد اور امریکی اولاد دیکھتے ہیں۔
    • تخلیق کاروں کا درجہ بندی۔ ہم اطالوی اولاد اور امریکی اولاد دیکھتے ہیں۔
  4. سپر CoffeeShopکلاس کے پاس اس بارے میں کوئی معلومات نہیں ہے کہ کون سا مخصوص پروڈکٹ ( Coffee) بنایا جائے گا۔
  5. سپر CoffeeShopکلاس ایک مخصوص پروڈکٹ کی تخلیق کو اس کی اولاد کو سونپتا ہے۔
  6. طبقے کا ہر اولاد اپنی مخصوص خصوصیات کے مطابق CoffeeShopایک فیکٹری طریقہ نافذ کرتا ہے ۔ createCoffee()دوسرے لفظوں میں، پروڈیوسر کلاسز کے نفاذ سے پروڈیوسر کلاس کی خصوصیات کی بنیاد پر مخصوص مصنوعات تیار ہوتی ہیں۔
اب آپ فیکٹری میتھڈ پیٹرن کی تعریف کے لیے تیار ہیں ۔ فیکٹری میتھڈ پیٹرن کسی شے کو بنانے کے لیے ایک انٹرفیس کی وضاحت کرتا ہے، لیکن ذیلی طبقات کو تخلیق کردہ آبجیکٹ کی کلاس کو منتخب کرنے کی اجازت دیتا ہے۔ اس طرح، ایک فیکٹری طریقہ ذیلی کلاسوں کو ایک مثال کی تخلیق کے حوالے کرتا ہے۔ عام طور پر، تعریف کو یاد رکھنا اتنا اہم نہیں ہے جتنا یہ سمجھنا کہ یہ سب کیسے کام کرتا ہے۔

فیکٹری کے طریقہ کار کی ساخت

ڈیزائن پیٹرن: فیکٹری طریقہ - 3اوپر دیا گیا خاکہ فیکٹری کے طریقہ کار کی عمومی ساخت کو ظاہر کرتا ہے۔ یہاں اور کیا اہم ہے؟
  1. تخلیق کار کلاس تمام طریقوں کو لاگو کرتی ہے جو مصنوعات کے ساتھ تعامل کرتے ہیں، سوائے فیکٹری کے طریقہ کے۔
  2. تجریدی factoryMethod()طریقہ کو کلاس کی تمام اولادوں کے ذریعہ لاگو کیا جانا چاہئے Creator۔
  3. کلاس طریقہ کو ConcreteCreatorنافذ کرتی ہے factoryMethod()، جو براہ راست پروڈکٹ کو تخلیق کرتی ہے۔
  4. یہ کلاس مخصوص مصنوعات بنانے کے لیے ذمہ دار ہے۔ یہ واحد کلاس ہے جس میں ان مصنوعات کو بنانے کے بارے میں معلومات ہیں۔
  5. تمام پروڈکٹس کو ایک مشترکہ انٹرفیس نافذ کرنا چاہیے، یعنی وہ ایک مشترکہ پروڈکٹ کلاس کی اولاد ہونے چاہئیں۔ یہ ضروری ہے تاکہ مصنوعات استعمال کرنے والی کلاسیں مخصوص نفاذ کے بجائے ان پر تجرید کے طور پر کام کر سکیں۔

گھر کا کام

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