سلام اڄ اسان ڊيزائن جي نمونن جو مطالعو جاري رکنداسين ۽ اسان تجريدي ڪارخاني جي نموني تي بحث ڪنداسين . هتي اهو آهي جيڪو اسان سبق ۾ ڍڪيندا سين:
- اسان بحث ڪنداسين ته هڪ تجريدي ڪارخانو ڇا آهي ۽ اهو ڪهڙو مسئلو حل ڪري ٿو
- اسان يوزر انٽرفيس ذريعي ڪافي جو آرڊر ڪرڻ لاءِ ڪراس پليٽ فارم ايپليڪيشن جو کنڊر ٺاهينداسين
- اسان هن نموني کي ڪيئن استعمال ڪرڻ جي هدايتن جو مطالعو ڪنداسين، بشمول هڪ ڊراگرام ۽ ڪوڊ ڏسڻ
- ۽ بونس جي طور تي، هن سبق ۾ هڪ لڪيل ايسٽر ايگ شامل آهي جيڪو توهان کي سکڻ ۾ مدد ڏيندو ته جاوا کي ڪيئن استعمال ڪجي آپريٽنگ سسٽم جو نالو طئي ڪرڻ لاءِ ۽ نتيجي تي منحصر ڪري هڪ ٻيو عمل يا ٻيو عمل ڪرڻ لاءِ.
- جاوا ۾ وراثت
- جاوا ۾ تجريدي ڪلاس ۽ طريقا
هڪ خلاصو ڪارخانو ڪهڙو مسئلو حل ڪري ٿو؟
ھڪڙو خلاصو ڪارخانو، سڀني ڪارخاني جي نمونن وانگر، اسان کي يقيني بڻائڻ ۾ مدد ڪري ٿي ته نئين شيون صحيح طور تي ٺاھيو وڃي. اسان ان کي استعمال ڪريون ٿا "پيداوار" کي منظم ڪرڻ لاءِ مختلف خاندانن سان ڳنڍيل شين جي. هڪٻئي سان جڙيل شيون جا مختلف خاندان... ان جو ڇا مطلب آهي؟ پريشان نه ڪريو: عملي طور تي، هر شيء سادو آهي ان کان وڌيڪ لڳي سگھي ٿو. شروع ڪرڻ سان، هڪ ٻئي سان ڳنڍيل شين جو خاندان ڇا ٿي سگهي ٿو؟ فرض ڪريو اسان هڪ فوجي حڪمت عملي ٺاهي رهيا آهيون جنهن ۾ ڪيترن ئي قسمن جا يونٽ شامل آهن:- پيادل فوج
- گهوڙي سوار
- تيرنداز
اچو ته اسان جي ڪافي شاپ کي خودڪار ڪرڻ جاري رکون
آخري سبق ۾ ، اسان ڪارخاني جي طريقي جي نموني جو اڀياس ڪيو. اسان ان کي استعمال ڪيو اسان جي ڪافي ڪاروبار کي وڌائڻ ۽ ڪيترن ئي نئين جڳهن کي کولڻ لاء. اڄ اسان اسان جي ڪاروبار کي جديد ڪرڻ جاري رکنداسين. تجريدي ڪارخاني جو نمونو استعمال ڪندي، اسان آن لائن ڪافي آرڊر ڪرڻ لاءِ نئين ڊيسڪ ٽاپ ايپليڪيشن جو بنياد رکنداسين. جڏهن هڪ ڊيسڪ ٽاپ ايپليڪيشن لکڻ، اسان کي هميشه ڪراس-پليٽ فارم سپورٽ بابت سوچڻ گهرجي. اسان جي ايپليڪيشن کي 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 لاءِ پراڊڪٽ فيملي جا مختلف عمل.
- هڪ خلاصو ڪارخانو جيڪو وضاحت ڪري ٿو هڪ انٽرفيس اسان جي پروڊڪٽس ٺاهڻ لاءِ.
- اسان جي ڪارخاني جا ٻه عمل، هر هڪ ذميوار پيداوار جي مخصوص خاندان ٺاهڻ لاء.
- هڪ فارم (هڪ جاوا ڪلاس) جنهن جا شعبا خلاصا انٽرفيس عناصر آهن جيڪي هڪ تجريدي ڪارخاني جي استعمال سان تعمير ڪندڙ ۾ ضروري قدرن سان شروع ڪيا ويا آهن.
- ايپليڪيشن ڪلاس هن ڪلاس جي اندر، اسان هڪ فارم ٺاهيندا آهيون، گهربل ڪارخاني جي عمل کي ان جي تعمير ڪندڙ ڏانهن منتقل ڪندي.
خلاصو ڪارخانو: ڪيئن استعمال ڪجي
هڪ خلاصو ڪارخانو هڪ ڊزائن جو نمونو آهي جيڪو مختلف پراڊڪٽ خاندانن جي تخليق کي منظم ڪرڻ لاءِ بغير ڪنڪريٽ پراڊڪٽ جي طبقن سان ڳنڍيل آهي. جڏهن هن نموني کي استعمال ڪندي، توهان کي لازمي آهي:- مصنوعات جي خاندانن جي وضاحت ڪريو. فرض ڪريو اسان وٽ انهن مان ٻه آهن:
SpecificProductA1
,SpecificProductB1
SpecificProductA2
,SpecificProductB2
- خاندان جي اندر هر پراڊڪٽ لاءِ، هڪ خلاصو ڪلاس (انٽرفيس) بيان ڪريو. اسان جي صورت ۾، اسان وٽ آهي:
ProductA
ProductB
- هر پراڊڪٽ جي خاندان ۾، هر پراڊڪٽ کي لازمي طور تي قدم 2 ۾ بيان ڪيل انٽرفيس کي لاڳو ڪرڻ گهرجي.
- هڪ خلاصو ڪارخانو ٺاهيو، هر پراڊڪٽ ٺاهڻ جي طريقن سان قدم 2 ۾ بيان ڪيل آهي. اسان جي صورت ۾، اهي طريقا هي هوندا:
ProductA createProductA();
ProductB createProductB();
- خلاصو ڪارخانو لاڳو ڪرڻ ٺاهيو ته جيئن هر عمل هڪ واحد خاندان جي پيداوار جي پيداوار کي ڪنٽرول ڪري. هن کي ڪرڻ لاء، خلاصي ڪارخاني جي هر عمل جي اندر، توهان کي سڀني تخليقن جي طريقن کي لاڳو ڪرڻ جي ضرورت آهي ته جيئن اهي مخصوص پيداوار جي عملن کي ٺاهي ۽ واپس آڻين.
// 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 شيون ڪري سگهو ٿا:- ڪافي آرڊرنگ ايپليڪيشن کي بهتر ڪريو ته جيئن اهو لينڪس تي پڻ ڪم ڪري.
- ڪنهن به فوجي حڪمت عملي ۾ شامل يونٽن جي پيداوار لاءِ پنهنجو خلاصو ڪارخانو ٺاهيو. هي يا ته ٿي سگهي ٿو هڪ تاريخي فوجي حڪمت عملي جنهن ۾ حقيقي فوجون شامل هجن، يا orcs، gnomes ۽ elves سان گڏ هڪ تصوراتي حڪمت عملي هجي. اهم شيء اهو آهي ته ڪجهه چونڊيو جيڪو توهان جي فائدي ۾ آهي. تخليقي ٿيو، ڪنسول تي پيغام پرنٽ ڪريو، ۽ نمونن بابت سکڻ جو مزو وٺو!
GO TO FULL VERSION