CodeGym /جاوا بلاگ /Random-SD /ڊيزائن جا نمونا: خلاصو ڪارخانو
John Squirrels
سطح
San Francisco

ڊيزائن جا نمونا: خلاصو ڪارخانو

گروپ ۾ شايع ٿيل
سلام اڄ اسان ڊيزائن جي نمونن جو مطالعو جاري رکنداسين ۽ اسان تجريدي ڪارخاني جي نموني تي بحث ڪنداسين . ڊيزائن جا نمونا: خلاصو ڪارخانو - 1هتي اهو آهي جيڪو اسان سبق ۾ ڍڪيندا سين:
  • اسان بحث ڪنداسين ته هڪ تجريدي ڪارخانو ڇا آهي ۽ اهو ڪهڙو مسئلو حل ڪري ٿو
  • اسان يوزر انٽرفيس ذريعي ڪافي جو آرڊر ڪرڻ لاءِ ڪراس پليٽ فارم ايپليڪيشن جو کنڊر ٺاهينداسين
  • اسان هن نموني کي ڪيئن استعمال ڪرڻ جي هدايتن جو مطالعو ڪنداسين، بشمول هڪ ڊراگرام ۽ ڪوڊ ڏسڻ
  • ۽ بونس جي طور تي، هن سبق ۾ هڪ لڪيل ايسٽر ايگ شامل آهي جيڪو توهان کي سکڻ ۾ مدد ڏيندو ته جاوا کي ڪيئن استعمال ڪجي آپريٽنگ سسٽم جو نالو طئي ڪرڻ لاءِ ۽ نتيجي تي منحصر ڪري هڪ ٻيو عمل يا ٻيو عمل ڪرڻ لاءِ.
ھن نموني کي پوريءَ طرح سمجھڻ لاءِ، توھان کي ھيٺين مضمونن ۾ چڱيءَ طرح ڄاڻ ھئڻ گھرجي.
  • جاوا ۾ وراثت
  • جاوا ۾ تجريدي ڪلاس ۽ طريقا

هڪ خلاصو ڪارخانو ڪهڙو مسئلو حل ڪري ٿو؟

ھڪڙو خلاصو ڪارخانو، سڀني ڪارخاني جي نمونن وانگر، اسان کي يقيني بڻائڻ ۾ مدد ڪري ٿي ته نئين شيون صحيح طور تي ٺاھيو وڃي. اسان ان کي استعمال ڪريون ٿا "پيداوار" کي منظم ڪرڻ لاءِ مختلف خاندانن سان ڳنڍيل شين جي. هڪٻئي سان جڙيل شيون جا مختلف خاندان... ان جو ڇا مطلب آهي؟ پريشان نه ڪريو: عملي طور تي، هر شيء سادو آهي ان کان وڌيڪ لڳي سگھي ٿو. شروع ڪرڻ سان، هڪ ٻئي سان ڳنڍيل شين جو خاندان ڇا ٿي سگهي ٿو؟ فرض ڪريو اسان هڪ فوجي حڪمت عملي ٺاهي رهيا آهيون جنهن ۾ ڪيترن ئي قسمن جا يونٽ شامل آهن:
  • پيادل فوج
  • گهوڙي سوار
  • تيرنداز
انهن قسمن جا يونٽ هڪ ٻئي سان ڳنڍيل آهن، ڇاڪاڻ ته اهي ساڳئي فوج ۾ خدمت ڪن ٿا. اسان اهو چئي سگهون ٿا ته مٿي ڏنل درجا بنديون هڪ ٻئي سان ڳنڍيل شيون جو خاندان آهن. اسان اهو سمجهون ٿا. پر تجريدي ڪارخاني جو نمونو استعمال ڪيو ويندو آھي مختلف خاندانن جي ٺاھڻ کي ترتيب ڏيڻ لاءِ جيڪي ھڪ ٻئي سان ڳنڍيل شيون آھن. هتي ڪجھ به پيچيده ناهي. اچو ته فوجي حڪمت عملي جي مثال سان جاري رکون. عام طور تي، فوجي يونٽ ڪيترن ئي مختلف جنگي پارٽين سان تعلق رکن ٿا. جن جي پاسي تي اهي آهن تي منحصر ڪري، فوجي يونٽ ظاهر ۾ مختلف ٿي سگهن ٿا. رومي فوج جا پيادل سپاهي، گهوڙي سوار ۽ تير انداز وائڪنگ پيادل سپاهي، گهوڙي سوار ۽ تير انداز نه آهن. فوجي حڪمت عملي ۾، مختلف فوجن جا سپاهي هڪ ٻئي سان ڳنڍيل شيون جا مختلف خاندان آهن. اها ڳالهه مذاق جي ڳالهه هوندي جيڪڏهن ڪنهن پروگرامر جي غلطي سبب هڪ سپاهي نيپولين جي دور جي فرينچ يونيفارم ۾، تياري ۾ مسڪيٽ، رومن پيادل فوج جي صفن جي وچ ۾ هلندي نظر اچي. هن مسئلي کي حل ڪرڻ لاءِ خلاصي فيڪٽري ڊيزائن جي نموني جي ضرورت آهي. نه، شرمندگي جو مسئلو نه آهي جيڪو وقت جي سفر مان اچي سگهي ٿو، پر هڪ ٻئي سان ڳنڍيل شين جي مختلف گروپن ٺاهڻ جو مسئلو. هڪ تجريدي ڪارخانو سڀني دستياب شين کي ٺاهڻ لاءِ هڪ انٽرفيس مهيا ڪري ٿو (شيون جو هڪ خاندان). هڪ خلاصو ڪارخانو عام طور تي ڪيترن ئي عملن تي مشتمل آهي. انهن مان هر هڪ خاندان مان هڪ جي پيداوار ٺاهڻ لاء ذميوار آهي. اسان جي فوجي حڪمت عملي ۾ هڪ تجريدي ڪارخانو شامل هوندو جيڪو تجريدي پيادل سپاهين، تيرنداز ۽ گهوڙي سوارن کي پيدا ڪري ٿو، انهي سان گڏ هن ڪارخاني تي عمل درآمد. مثال طور، هڪ ڪارخانو جيڪو ٺاهي ٿو رومن legionnaires ۽ هڪ ڪارخانو جيڪو Carthaginian سپاهي ٺاهي ٿو. خلاصو هن نموني جو سڀ کان اهم رهنمائي وارو اصول آهي. فيڪٽري جا گراهڪ فيڪٽري ۽ ان جي شين سان صرف خلاصي انٽرفيس ذريعي ڪم ڪن ٿا. نتيجي طور، توهان کي اهو سوچڻ جي ضرورت ناهي ته ڪهڙا سپاهي هن وقت ٺاهي رهيا آهن. ان جي بدران، توهان هن ذميواري کي خلاصو ڪارخاني جي ڪجهه ڪنڪريٽ عمل درآمد ڏانهن منتقل ڪيو.

اچو ته اسان جي ڪافي شاپ کي خودڪار ڪرڻ جاري رکون

آخري سبق ۾ ، اسان ڪارخاني جي طريقي جي نموني جو اڀياس ڪيو. اسان ان کي استعمال ڪيو اسان جي ڪافي ڪاروبار کي وڌائڻ ۽ ڪيترن ئي نئين جڳهن کي کولڻ لاء. اڄ اسان اسان جي ڪاروبار کي جديد ڪرڻ جاري رکنداسين. تجريدي ڪارخاني جو نمونو استعمال ڪندي، اسان آن لائن ڪافي آرڊر ڪرڻ لاءِ نئين ڊيسڪ ٽاپ ايپليڪيشن جو بنياد رکنداسين. جڏهن هڪ ڊيسڪ ٽاپ ايپليڪيشن لکڻ، اسان کي هميشه ڪراس-پليٽ فارم سپورٽ بابت سوچڻ گهرجي. اسان جي ايپليڪيشن کي MacOS ۽ ونڊوز ٻنهي تي ڪم ڪرڻ گهرجي (اسپائلر: لينڪس لاءِ سپورٽ توهان لاءِ ڇڏي وئي آهي هوم ورڪ جي طور تي لاڳو ڪرڻ لاءِ). اسان جي درخواست ڪيئن نظر ايندي؟ تمام سادو: اهو هڪ فارم هوندو جنهن ۾ ٽيڪسٽ فيلڊ، هڪ چونڊ فيلڊ، ۽ هڪ بٽڻ شامل هوندو. جيڪڏهن توهان وٽ مختلف آپريٽنگ سسٽم استعمال ڪرڻ جو تجربو آهي، توهان ضرور محسوس ڪيو آهي ته ونڊوز تي بٽڻ هڪ Mac جي ڀيٽ ۾ مختلف طور تي پيش ڪيا ويا آهن. جيئن ته سڀ ڪجهه آهي ... خير، اچو ته شروع ڪريون. جئين توهان شايد اڳ ۾ ئي محسوس ڪيو آهي، پيداوار جي خاندانن تي مشتمل هوندي گرافڪ انٽرفيس جي عناصر تي مشتمل آهي:
  • بٽڻ
  • ٽيڪسٽ فيلڊز
  • چونڊ جا ميدان
ڊسڪليمر: هر انٽرفيس ۾، اسان طريقن جي وضاحت ڪري سگهون ٿا جهڙوڪ onClick, onValueChanged, or onInputChanged. ٻين لفظن ۾، اسان طريقن جي وضاحت ڪري سگھون ٿا جيڪي اسان کي مختلف واقعن کي سنڀالڻ جي اجازت ڏين ٿا (بٽڻ کي دٻائڻ، ٽيڪسٽ داخل ڪرڻ، چونڊ باڪس ۾ قيمت چونڊيو). اهو سڀ ڪجهه هتي عمدي طور تي ختم ڪيو ويو آهي ته جيئن مثال کي اوورلوڊ نه ڪيو وڃي ۽ ان کي واضح ڪري سگهون جيئن اسان ڪارخاني جي نموني جو مطالعو ڪريون. اچو ته وضاحت ڪريون خلاصي انٽرفيس اسان جي پروڊڪٽس لاءِ:
public interface Button {}
public interface Select {}
public interface TextField {}
هر آپريٽنگ سسٽم لاء، اسان کي آپريٽنگ سسٽم جي انداز ۾ انٽرفيس عناصر ٺاهڻ گهرجي. اسان Windows ۽ MacOS لاءِ ڪوڊ لکنداسين. اچو ته ونڊوز لاءِ عمل درآمد ڪيون:
public class WindowsButton implements Button {
}

public class WindowsSelect implements Select {
}

public class WindowsTextField implements TextField {
}
هاڻي اسان MacOS لاءِ ائين ئي ڪندا آهيون:
public class MacButton implements Button {
}

public class MacSelect implements Select {
}

public class MacTextField implements TextField {
}
تمام سٺو. ھاڻي اسان پنھنجي خلاصي ڪارخاني ڏانھن اڳتي وڌي سگھون ٿا، جيڪو سڀني موجود خلاصو مصنوعات جي قسمن کي ٺاھيندو:
public interface GUIFactory {

    Button createButton();
    TextField createTextField();
    Select createSelect();

}
شاندار. جئين توهان ڏسي سگهو ٿا، اسان اڃا تائين ڪجهه پيچيده نه ڪيو آهي. سڀڪنھن شيء کي پٺيان به سادو آهي. پروڊڪٽس سان قياس ڪندي، اسان هر OS لاءِ مختلف ڪارخانا لاڳو ڪندا آهيون. اچو ته ونڊوز سان شروع ڪريون:
public class WindowsGUIFactory implements GUIFactory {
    public WindowsGUIFactory() {
        System.out.println("Creating GUIFactory for Windows OS");
    }

    public Button createButton() {
        System.out.println("Creating Button for Windows OS");
        return new WindowsButton();
    }

    public TextField createTextField() {
        System.out.println("Creating TextField for Windows OS");
        return new WindowsTextField();
    }

    public Select createSelect() {
        System.out.println("Creating Select for Windows OS");
        return new WindowsSelect();
    }
}
اسان ڪجھ ڪنسول آئوٽ شامل ڪيو آھي طريقن ۽ ٺاھيندڙ جي اندر وڌيڪ وضاحت ڪرڻ لاءِ ته ڇا ٿي رھيو آھي. هاڻي macOS لاءِ:
public class MacGUIFactory implements GUIFactory {
    public MacGUIFactory() {
        System.out.println("Creating GUIFactory for macOS");
    }

    @Override
    public Button createButton() {
        System.out.println("Creating Button for macOS");
        return new MacButton();
    }

    @Override
    public TextField createTextField() {
        System.out.println("Creating TextField for macOS");
        return new MacTextField();
    }

    @Override
    public Select createSelect() {
        System.out.println("Creating Select for macOS");
        return new MacSelect();
    }
}
نوٽ ڪريو ته هر طريقي جي دستخط ظاهر ڪري ٿو ته طريقو هڪ خلاصو قسم واپس ڪري ٿو. پر طريقن جي اندر، اسان پروڊڪٽس جي مخصوص عملن کي ٺاهي رهيا آهيون. هي واحد جڳهه آهي جيڪو اسان مخصوص مثالن جي تخليق کي سنڀاليندا آهيون. هاڻي اهو وقت آهي فارم لاءِ ڪلاس لکڻ جو. هي هڪ جاوا ڪلاس آهي جنهن جا فيلڊ انٽرفيس عناصر آهن:
public class CoffeeOrderForm {
    private final TextField customerNameTextField;
    private final Select coffeeTypeSelect;
    private final Button orderButton;

    public CoffeeOrderForm(GUIFactory factory) {
        System.out.println("Creating coffee order form");
        customerNameTextField = factory.createTextField();
        coffeeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
ھڪڙو خلاصو ڪارخانو جيڪو ٺاھي ٿو انٽرفيس عناصر ٺاھيو ويو آھي فارم جي ٺاھيندڙ ڏانھن. اسان هڪ خاص OS لاءِ انٽرفيس عناصر ٺاهڻ لاءِ تعمير ڪندڙ کي ضروري ڪارخاني تي عمل درآمد ڪنداسين.
public class Application {
    private CoffeeOrderForm coffeeOrderForm;

    public void drawCoffeeOrderForm() {
        // Determine the name of the operating system through System.getProperty()
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // For Windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // For Mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS. Unable to draw form :(");
            return;
        }
        coffeeOrderForm = new CoffeeOrderForm(guiFactory);
    }

    public static void main(String[] args) {
        Application application = new Application();
        application.drawCoffeeOrderForm();
    }
}
جيڪڏهن اسان ونڊوز تي ايپليڪيشن کي هلائيندا آهيون، اسان کي هيٺين پيداوار حاصل ٿيندي:

Creating GUIFactory for Windows OS
Creating coffee order form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
Mac تي، ٻاھر ڏنل ھوندو:

Creating GUIFactory for macOS
Creating coffee order form
Creating TextField for macOS
Creating Select for macOS
Creating Button for macOS
لينڪس تي:

Unknown OS. Unable to draw form :( 
۽ هاڻي اسان اختصار ڪريون ٿا. اسان هڪ GUI جي بنياد تي ايپليڪيشن جو کنڊر لکيو آهي جنهن ۾ انٽرفيس عناصر خاص طور تي لاڳاپيل OS لاءِ ٺاهيا ويا آهن. اسان مختصر طور تي ورجائينداسين جيڪو اسان ٺاهيو آهي:
  • هڪ پراڊڪٽ خاندان جنهن ۾ هڪ ان پٽ فيلڊ، هڪ چونڊ فيلڊ، ۽ هڪ بٽڻ شامل آهي.
  • ونڊوز ۽ macOS لاءِ پراڊڪٽ فيملي جا مختلف عمل.
  • هڪ خلاصو ڪارخانو جيڪو وضاحت ڪري ٿو هڪ انٽرفيس اسان جي پروڊڪٽس ٺاهڻ لاءِ.
  • اسان جي ڪارخاني جا ٻه عمل، هر هڪ ذميوار پيداوار جي مخصوص خاندان ٺاهڻ لاء.
  • هڪ فارم (هڪ جاوا ڪلاس) جنهن جا شعبا خلاصا انٽرفيس عناصر آهن جيڪي هڪ تجريدي ڪارخاني جي استعمال سان تعمير ڪندڙ ۾ ضروري قدرن سان شروع ڪيا ويا آهن.
  • ايپليڪيشن ڪلاس هن ڪلاس جي اندر، اسان هڪ فارم ٺاهيندا آهيون، گهربل ڪارخاني جي عمل کي ان جي تعمير ڪندڙ ڏانهن منتقل ڪندي.
نتيجو اهو آهي ته اسان تجريدي ڪارخاني واري نموني کي لاڳو ڪيو.

خلاصو ڪارخانو: ڪيئن استعمال ڪجي

هڪ خلاصو ڪارخانو هڪ ڊزائن جو نمونو آهي جيڪو مختلف پراڊڪٽ خاندانن جي تخليق کي منظم ڪرڻ لاءِ بغير ڪنڪريٽ پراڊڪٽ جي طبقن سان ڳنڍيل آهي. جڏهن هن نموني کي استعمال ڪندي، توهان کي لازمي آهي:
  1. مصنوعات جي خاندانن جي وضاحت ڪريو. فرض ڪريو اسان وٽ انهن مان ٻه آهن:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. خاندان جي اندر هر پراڊڪٽ لاءِ، هڪ خلاصو ڪلاس (انٽرفيس) بيان ڪريو. اسان جي صورت ۾، اسان وٽ آهي:
    • ProductA
    • ProductB
  3. هر پراڊڪٽ جي خاندان ۾، هر پراڊڪٽ کي لازمي طور تي قدم 2 ۾ بيان ڪيل انٽرفيس کي لاڳو ڪرڻ گهرجي.
  4. هڪ خلاصو ڪارخانو ٺاهيو، هر پراڊڪٽ ٺاهڻ جي طريقن سان قدم 2 ۾ بيان ڪيل آهي. اسان جي صورت ۾، اهي طريقا هي هوندا:
    • ProductA createProductA();
    • ProductB createProductB();
  5. خلاصو ڪارخانو لاڳو ڪرڻ ٺاهيو ته جيئن هر عمل هڪ واحد خاندان جي پيداوار جي پيداوار کي ڪنٽرول ڪري. هن کي ڪرڻ لاء، خلاصي ڪارخاني جي هر عمل جي اندر، توهان کي سڀني تخليقن جي طريقن کي لاڳو ڪرڻ جي ضرورت آهي ته جيئن اهي مخصوص پيداوار جي عملن کي ٺاهي ۽ واپس آڻين.
هيٺ ڏنل يو ايم ايل ڊراگرام مٿي بيان ڪيل هدايتن کي بيان ڪري ٿو: ڊيزائن جا نمونا: خلاصو ڪارخانو - 3هاڻي اسان انهن هدايتن جي مطابق ڪوڊ لکنداسين:
// Define common product interfaces
public interface ProductA {}
public interface ProductB {}

// Create various implementations (families) of our products
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}

public class SpecificProductA2 implements ProductA {}
public class SpecificProductB2 implements ProductB {}

// Create an abstract factory
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// Implement the abstract factory in order to create products in family 1
public class SpecificFactory1 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA1();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB1();
    }
}

// Implement the abstract factory in order to create products in family 2
public class SpecificFactory2 implements AbstractFactory {

    @Override
    public ProductA createProductA() {
        return new SpecificProductA2();
    }

    @Override
    public ProductB createProductB() {
        return new SpecificProductB2();
    }
}

گهر جو ڪم

مواد کي مضبوط ڪرڻ لاء، توهان 2 شيون ڪري سگهو ٿا:
  1. ڪافي آرڊرنگ ايپليڪيشن کي بهتر ڪريو ته جيئن اهو لينڪس تي پڻ ڪم ڪري.
  2. ڪنهن به فوجي حڪمت عملي ۾ شامل يونٽن جي پيداوار لاءِ پنهنجو خلاصو ڪارخانو ٺاهيو. هي يا ته ٿي سگهي ٿو هڪ تاريخي فوجي حڪمت عملي جنهن ۾ حقيقي فوجون شامل هجن، يا orcs، gnomes ۽ elves سان گڏ هڪ تصوراتي حڪمت عملي هجي. اهم شيء اهو آهي ته ڪجهه چونڊيو جيڪو توهان جي فائدي ۾ آهي. تخليقي ٿيو، ڪنسول تي پيغام پرنٽ ڪريو، ۽ نمونن بابت سکڻ جو مزو وٺو!
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION