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

ڈیزائن پیٹرن: خلاصہ فیکٹری

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

ایک تجریدی کارخانہ کن مسائل کو حل کرتا ہے؟

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

آئیے اپنی کافی شاپ کو خودکار کرنا جاری رکھیں

پچھلے سبق میں ، ہم نے فیکٹری کے طریقہ کار کا مطالعہ کیا۔ ہم نے اسے اپنے کافی کے کاروبار کو بڑھانے اور کئی نئے مقامات کھولنے کے لیے استعمال کیا۔ آج ہم اپنے کاروبار کو جدید بنانا جاری رکھیں گے۔ تجریدی فیکٹری پیٹرن کا استعمال کرتے ہوئے، ہم آن لائن کافی آرڈر کرنے کے لیے ایک نئی ڈیسک ٹاپ ایپلیکیشن کی بنیاد رکھیں گے۔ ڈیسک ٹاپ ایپلیکیشن لکھتے وقت، ہمیں ہمیشہ کراس پلیٹ فارم سپورٹ کے بارے میں سوچنا چاہیے۔ ہماری ایپلیکیشن کو macOS اور Windows دونوں پر کام کرنا چاہیے (Spoiler: Linux کے لیے سپورٹ آپ کو ہوم ورک کے طور پر نافذ کرنے کے لیے چھوڑ دیا گیا ہے)۔ ہماری درخواست کیسی نظر آئے گی؟ بہت آسان: یہ ایک ٹیکسٹ فیلڈ، سلیکشن فیلڈ اور بٹن پر مشتمل ایک فارم ہوگا۔ اگر آپ کو مختلف آپریٹنگ سسٹم استعمال کرنے کا تجربہ ہے، تو آپ نے یقینی طور پر محسوس کیا ہوگا کہ ونڈوز پر بٹن میک کے مقابلے مختلف طریقے سے پیش کیے جاتے ہیں۔ جیسا کہ باقی سب کچھ ہے ... ٹھیک ہے، چلو شروع کرتے ہیں. جیسا کہ آپ نے پہلے ہی سمجھ لیا ہے، پروڈکٹ فیملیز گرافیکل انٹرفیس کے عناصر پر مشتمل ہوں گی:
  • بٹن
  • ٹیکسٹ فیلڈز
  • انتخاب کے میدان
اعلان دستبرداری: ہر انٹرفیس میں، ہم طریقوں کی وضاحت کر سکتے ہیں جیسے 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
میک پر، آؤٹ پٹ اس طرح ہو گا:

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 کے لیے بنائے گئے ہیں۔ ہم اختصار کے ساتھ جو کچھ ہم نے بنایا ہے اسے دہرائیں گے:
  • ایک پروڈکٹ فیملی جس میں ایک ان پٹ فیلڈ، ایک سلیکشن فیلڈ، اور ایک بٹن ہوتا ہے۔
  • ونڈوز اور میک او ایس کے لیے پروڈکٹ فیملی کے مختلف نفاذ۔
  • ایک تجریدی فیکٹری جو ہماری مصنوعات بنانے کے لیے ایک انٹرفیس کی وضاحت کرتی ہے۔
  • ہماری فیکٹری کے دو نفاذ، ہر ایک مصنوعات کی ایک مخصوص فیملی بنانے کے لیے ذمہ دار ہے۔
  • ایک فارم (ایک جاوا کلاس) جس کے فیلڈز تجریدی انٹرفیس عناصر ہیں جو ایک تجریدی فیکٹری کا استعمال کرتے ہوئے کنسٹرکٹر میں ضروری اقدار کے ساتھ شروع کیے جاتے ہیں۔
  • ایپلیکیشن کلاس اس کلاس کے اندر، ہم ایک فارم بناتے ہیں، مطلوبہ فیکٹری کے نفاذ کو اس کے کنسٹرکٹر کو دیتے ہیں۔
نتیجہ یہ ہے کہ ہم نے تجریدی فیکٹری پیٹرن کو نافذ کیا۔

خلاصہ فیکٹری: استعمال کرنے کا طریقہ

ایک تجریدی کارخانہ کنکریٹ مصنوعات کی کلاسوں سے منسلک کیے بغیر مختلف پروڈکٹ فیملیز کی تخلیق کا انتظام کرنے کے لیے ایک ڈیزائن پیٹرن ہے۔ اس پیٹرن کو استعمال کرتے وقت، آپ کو:
  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