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

ڊيزائن جا نمونا: Abstract Factory

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

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

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

اسان ڪافي شاپ کي خودڪار ڪرڻ جاري رکون ٿا

پوئين ليڪچر ۾ ، اسان فئڪٽري جي طريقي جي نموني جو اڀياس ڪيو، جنهن جي مدد سان اسان ڪافي جي ڪاروبار کي وڌائڻ جي قابل ٿي ويا ۽ ڪافي نوان وڪرو پوائنٽ کوليا. اڄ اسان پنهنجي ڪاروبار کي جديد بڻائڻ لاءِ پنهنجو ڪم جاري رکنداسين. تجريدي ڪارخاني جو نمونو استعمال ڪندي، اسان آن لائن ڪافي آرڊر ڪرڻ لاءِ نئين ڊيسڪ ٽاپ ايپليڪيشن جو بنياد رکنداسين. جڏهن اسان ڊيسڪ ٽاپ لاءِ ايپليڪيشن لکون ٿا، اسان کي هميشه ڪراس پليٽ فارم بابت سوچڻ گهرجي. اسان جي ايپليڪيشن کي MacOS ۽ ونڊوز ٻنهي تي ڪم ڪرڻ گهرجي (اسپائلر: لينڪس توهان لاءِ هوم ورڪ طور ڇڏي ويندو). اسان جي درخواست ڪيئن نظر ايندي؟ بلڪل سادو: هي هڪ فارم هوندو جنهن تي مشتمل هوندو هڪ ٽيڪسٽ فيلڊ، هڪ چونڊيو فيلڊ، ۽ هڪ بٽڻ. جيڪڏهن توهان کي مختلف آپريٽنگ سسٽم استعمال ڪرڻ جو تجربو آهي، توهان ضرور محسوس ڪيو آهي ته ونڊوز تي بٽڻون Mac جي ڀيٽ ۾ مختلف طور تي پيش ڪيون ويون آهن. ٻين سڀني وانگر ... سو، اچو ته شروع ڪريون. پيداوار جي خاندانن جي ڪردار ۾، جيئن توهان شايد اڳ ۾ ئي سمجهي چڪا آهيو، اسان وٽ گرافڪ انٽرفيس عناصر هوندا:
  • بٽڻ؛
  • ٽيڪسٽ فيلڊ؛
  • چونڊ لاءِ ميدان.
رد ڪرڻ. هر انٽرفيس ۾ اسان طريقن جي وضاحت ڪري سگهون ٿا جهڙوڪ onClick، onValueChangedيا 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 gui factory 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 gui factory 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 OrderCoffeeForm {
    private final TextField customerNameTextField;
    private final Select coffeTypeSelect;
    private final Button orderButton;

    public OrderCoffeeForm(GUIFactory factory) {
        System.out.println("Creating order coffee form");
        customerNameTextField = factory.createTextField();
        coffeTypeSelect = factory.createSelect();
        orderButton = factory.createButton();
    }
}
ھڪڙو خلاصو ڪارخانو ٺاھيو ويو آھي فارم ٺاھيندڙ ڏانھن، جيڪو ٺاھي ٿو انٽرفيس عناصر. اسان گهربل ڪارخاني تي عمل درآمد کي تعمير ڪندڙ کي منتقل ڪنداسين ته جيئن اسان هڪ خاص OS لاء انٽرفيس عناصر ٺاهي سگهون ٿا.
public class Application {
    private OrderCoffeeForm orderCoffeeForm;

    public void drawOrderCoffeeForm() {
        // Определим Name операционной системы, получив meaning системной проперти через System.getProperty
        String osName = System.getProperty("os.name").toLowerCase();
        GUIFactory guiFactory;

        if (osName.startsWith("win")) { // Для windows
            guiFactory = new WindowsGUIFactory();
        } else if (osName.startsWith("mac")) { // Для mac
            guiFactory = new MacGUIFactory();
        } else {
            System.out.println("Unknown OS, can't draw form :( ");
            return;
        }
        orderCoffeeForm = new OrderCoffeeForm(guiFactory);
    }

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

Creating gui factory for Windows OS
Creating order coffee form
Creating TextField for Windows OS
Creating Select for Windows OS
Creating Button for Windows OS
هڪ Mac تي پيداوار هن ريت هوندي:

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

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

خلاصو ڪارخانو: استعمال لاء هدايتون

خلاصو ڪارخانو مختلف پراڊڪٽ خاندانن جي تخليق کي منظم ڪرڻ لاءِ هڪ ڊزائين نمونو آهي بغير ڪنهن مخصوص پراڊڪٽ جي طبقن سان ڳنڍجي. جڏهن هي ٽيمپليٽ استعمال ڪندي، توهان کي لازمي آهي:
  1. پراڊڪٽ خاندانن جي پاڻ کي وضاحت ڪريو. اچو ته فرض ڪريو اسان وٽ انهن مان ٻه آهن:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. خاندان جي اندر هر پراڊڪٽ لاءِ، هڪ خلاصو ڪلاس (انٽرفيس) بيان ڪريو. اسان جي صورت ۾ اهو آهي:
    • ProductA
    • ProductB
  3. هر پراڊڪٽ جي خاندان ۾، هر پراڊڪٽ کي لازمي طور تي قدم 2 ۾ بيان ڪيل انٽرفيس کي لاڳو ڪرڻ گهرجي.
  4. قدم 2 ۾ بيان ڪيل هر پراڊڪٽ لاءِ طريقن سان گڏ هڪ خلاصو ڪارخانو ٺاهيو. اسان جي صورت ۾، اهي طريقا هوندا:
    • ProductA createProductA();
    • ProductB createProductB();
  5. تجريدي ڪارخاني جي عملن کي ٺاهيو ته جيئن هر عمل درآمد هڪ ئي خاندان جي شين جي پيداوار کي ڪنٽرول ڪري. هن کي ڪرڻ لاء، تجريدي ڪارخاني جي هر عمل جي اندر، اهو ضروري آهي ته سڀني ٺاهيل طريقن کي لاڳو ڪرڻ لاء، انهي ڪري ته مصنوعات جي ٺهڪندڙ عملن کي پيدا ڪيو وڃي ۽ انهن جي اندر واپس اچي.
هيٺ ڏنل يو ايم ايل ڊراگرام آهي جيڪو مٿي بيان ڪيل هدايتن کي بيان ڪري ٿو: ڊيزائن جا نمونا: AbstractFactory - 3هاڻي اچو ته هن هدايتن لاءِ ڪوڊ لکون:
// Определим общие интерфейсы продуктов
public interface ProductA {}
public interface ProductB {}

// Создадим различные реализации (семейства) наших продуктов
public class SpecificProductA1 implements ProductA {}
public class SpecificProductB1 implements ProductB {}

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

// Создадим абстрактную фабрику
public interface AbstractFactory {
    ProductA createProductA();
    ProductB createProductB();
}

// Создадим реализацию абстрактной фабрики для создания продуктов семейства 1
public class SpecificFactory1 implements AbstractFactory {

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

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

// Создадим реализацию абстрактной фабрики для создания продуктов семейства 1
public class SpecificFactory2 implements AbstractFactory {

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

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

گهر جو ڪم

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