JavaRush /جاوا بلاگ /Random-SD /ڊيزائن جا نمونا: FactoryMethod

ڊيزائن جا نمونا: FactoryMethod

گروپ ۾ شايع ٿيل
سلام! اڄ اسان جاري ڪنداسين ڊيزائن جي نمونن جو مطالعو ۽ فيڪٽري جي طريقي بابت ڳالهائينداسين. ڊيزائن جا نمونا: فيڪٽري ميٿڊ - 1توھان کي معلوم ٿيندو ته اھو ڇا آھي ۽ ڪھڙن ڪمن لاءِ ھي ٽيمپليٽ مناسب آھي. اسان هن ڊزائن جي نموني کي عملي طور تي ڏسندا ۽ ان جي جوڙجڪ کي ڳوليندا سين. مٿين سڀني ڳالهين کي واضح ڪرڻ لاءِ، توهان کي هيٺين موضوعن کي سمجهڻ جي ضرورت آهي:
  1. جاوا ۾ وراثت.
  2. جاوا ۾ تجريدي طريقا ۽ ڪلاس.

فيڪٽري جو طريقو ڪهڙو مسئلو حل ڪري ٿو؟

فيڪٽري ڊيزائن جي سڀني نمونن ۾، شرڪت ڪندڙن جا ٻه گروهه آهن - تخليق ڪندڙ (فيڪٽريز پاڻ) ۽ مصنوعات (فيڪٽريز پاران ٺاهيل شيون). صورتحال جو تصور ڪريو: اسان وٽ ھڪڙو ڪارخانو آھي جيڪو آٽو رش برانڊ تحت ڪارون ٺاھي ٿو. هوء ڄاڻي ٿي ته مختلف قسمن جي جسمن سان ڪار ماڊل ڪيئن ٺاهي:
  • sedans
  • اسٽيشن ويگنون
  • ڪوپ
شيون اسان لاءِ تمام سٺيون ٿي رهيون هيون ته هڪ سٺو ڏينهن اسان OneAuto جي تشويش کي جذب ڪيو. سمجھدار مينيجرز جي طور تي، اسان OneAuto جي گراهڪن کي وڃائڻ نٿا چاهيون، ۽ اسان جو ڪم پيداوار جي جوڙجڪ کي اهڙي طرح سان ترتيب ڏيڻ آهي ته جيئن اسين پيدا ڪري سگهون:
  • AutoRush sedans
  • آٽو رش اسٽيشن ويگنون
  • coupe AutoRush
  • OneAuto sedans
  • OneAuto اسٽيشن ويگنون
  • OneAuto coupe
جئين توهان ڏسي سگهو ٿا، نڪتل شين جي هڪ گروپ جي بدران، ٻه ظاهر ٿيا، جيڪي ڪجهه تفصيلن ۾ مختلف آهن. فيڪٽري جو طريقو ڊيزائن جو نمونو حل ڪري ٿو پروڊڪٽس جي مختلف گروپن ٺاهڻ جو مسئلو، هر هڪ کي ڪجهه خاصيت سان. اسان عملي طور تي هن ٽيمپليٽ جي اصول تي غور ڪنداسين، تدريجي طور تي سادي کان پيچيده ڏانهن، اسان جي ڪافي شاپ جو مثال استعمال ڪندي، جيڪو اسان اڳئين ليڪچرن مان هڪ ۾ ٺاهيو هو .

فيڪٽري ٽيمپليٽ بابت ٿورڙو

مون کي توهان کي ياد ڏيارڻ ڏيو: اسان توهان سان گڏ هڪ ننڍڙو ورچوئل ڪافي شاپ ٺاهيو آهي. ان ۾، هڪ سادي ڪارخاني جي مدد سان، اسان مختلف قسمن جي ڪافي ٺاهڻ جي سکيا ڏني. اڄ اسان هن مثال کي بهتر ڪنداسين. اچو ته ياد رکون ته اسان جو ڪافي شاپ هڪ سادي ڪارخاني سان ڪهڙو نظر آيو. اسان وٽ ڪافي ڪلاس هو:
public class Coffee {
    public void grindCoffee(){
        // перемалываем кофе
    }
    public void makeCoffee(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
۽ پڻ سندس وارثن مان ڪيترائي - ڪافي جا مخصوص قسم جيڪي اسان جو ڪارخانو پيدا ڪري سگھن ٿا:
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("Вот ваш кофе! Спасибо, приходите еще!");
        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("Вот ваш кофе! Спасибо, приходите еще!");
    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;
    }

}
ھاڻي اسان گھربل ڪارخاني جي عمل کي CoffeeShop ڏانھن منتقل ڪري سگھون ٿا. اچو ته ڏسون ته مختلف ڪافي دڪانن تان ڪافي جو آرڊر ڏيڻ جو ڪوڊ ڪهڙو نظر ايندو. مثال طور، اطالوي ۽ آمريڪي انداز ۾ cappuccino:
public class Main {
    public static void main(String[] args) {
        /*
            Закажем капучино в итальянском стиле:
            1. Создадим фабрику для приготовления итальянского кофе
            2. Создадим новую кофейню, передав ей в конструкторе фабрику итальянского кофе
            3. Закажем наш кофе
         */
        SimpleItalianCoffeeFactory italianCoffeeFactory = new SimpleItalianCoffeeFactory();
        CoffeeShop italianCoffeeShop = new CoffeeShop(italianCoffeeFactory);
        italianCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);


         /*
            Закажем капучино в американском стиле
            1. Создадим фабрику для приготовления американского кофе
            2. Создадим новую кофейню, передав ей в конструкторе фабрику американского кофе
            3. Закажем наш кофе
         */
        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(){
        // делаем кофе
    }
    public void pourIntoCup(){
        // наливаем в чашку
    }
}
قدم 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("Вот ваш кофе! Спасибо, приходите еще!");
        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