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

- جاوا میں وراثت۔
- جاوا میں تجریدی طریقے اور کلاسز
فیکٹری کا طریقہ کیا مسئلہ حل کرتا ہے؟
تمام فیکٹری ڈیزائن پیٹرن میں دو قسم کے شرکاء ہوتے ہیں: تخلیق کار (خود کارخانے) اور مصنوعات (فیکٹریوں کی تخلیق کردہ اشیاء)۔ مندرجہ ذیل صورتحال کا تصور کریں: ہمارے پاس ایک فیکٹری ہے جو کوڈ جیم برانڈڈ کاریں تیار کرتی ہے۔ یہ مختلف قسم کے جسموں کے ساتھ کاروں کے ماڈل بنانے کا طریقہ جانتا ہے:- سیڈان
- اسٹیشن ویگنیں
- coupes
- کوڈ جیم سیڈان
- کوڈ جیم اسٹیشن ویگن
- کوڈ جیم کوپس
- OneAuto سیڈان
- ون آٹو اسٹیشن ویگن
- OneAuto کوپس
فیکٹری پیٹرن کے بارے میں تھوڑا سا
میں آپ کو یاد دلاتا ہوں کہ ہم نے پہلے ایک چھوٹی سی ورچوئل کافی شاپ بنائی تھی۔ ایک سادہ فیکٹری کی مدد سے، ہم نے کافی کی مختلف اقسام بنانے کا طریقہ سیکھا۔ آج ہم اس مثال پر دوبارہ کام کریں گے۔ آئیے یاد کرتے ہیں کہ ہماری کافی شاپ اپنی سادہ فیکٹری کے ساتھ کیسی لگتی تھی۔ ہماری کافی کلاس تھی:public class Coffee {
public void grindCoffee(){
// Grind the coffee
}
public void makeCoffee(){
// Brew the coffee
}
public void pourIntoCup(){
// Pour into a cup
}
}
اور کافی کی مخصوص اقسام کے مطابق کئی بچوں کی کلاسیں جو ہماری فیکٹری تیار کر سکتی ہیں:
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("Here's your coffee! Thanks! Come again!");
return coffee;
}
}
ایک سادہ فیکٹری کو جدید بنانا
ہماری کافی شاپ بہت اچھی چل رہی ہے۔ اتنا کہ ہم توسیع پر غور کر رہے ہیں۔ ہم کچھ نئے مقامات کھولنا چاہتے ہیں۔ ہم بولڈ اور انٹرپرائزنگ ہیں، اس لیے ہم بورنگ کافی شاپس کو کرینک نہیں کریں گے۔ ہم چاہتے ہیں کہ ہر دکان میں ایک خاص موڑ ہو۔ اس کے مطابق، شروع کرنے کے لیے، ہم دو مقامات کھولیں گے: ایک اطالوی اور ایک امریکی۔ یہ تبدیلیاں نہ صرف اندرونی ڈیزائن بلکہ پیش کیے جانے والے مشروبات کو بھی متاثر کریں گی۔- اطالوی کافی شاپ میں، ہم خصوصی طور پر اطالوی کافی برانڈز استعمال کریں گے، خصوصی پیسنے اور بھوننے کے ساتھ۔
- امریکی مقام کے بڑے حصے ہوں گے، اور ہم ہر آرڈر کے ساتھ مارشمیلو پیش کریں گے۔
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("Here's your coffee! Thanks! Come again!");
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;
}
}
اب ہم مطلوبہ فیکٹری کے نفاذ کو کافی شاپ تک پہنچا سکتے ہیں۔ آئیے دیکھتے ہیں کہ مختلف کافی شاپس سے کافی آرڈر کرنے کا کوڈ کیسا ہوگا۔ مثال کے طور پر، اطالوی طرز اور امریکی طرز کیپوچینو:
public class Main {
public static void main(String[] args) {
/*
Order an Italian-style cappuccino:
1. Create a factory for making Italian coffee
2. Create a new coffee shop, passing the Italian coffee factory to it through the constructor
3. Order our coffee
*/
SimpleItalianCoffeeFactory italianCoffeeFactory = new SimpleItalianCoffeeFactory();
CoffeeShop italianCoffeeShop = new CoffeeShop(italianCoffeeFactory);
italianCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);
/*
Order an American-style cappuccino
1. Create a factory for making American coffee
2. Create a new coffee shop, passing the American coffee factory to it through the constructor
3. Order our coffee
*/
SimpleAmericanCoffeeFactory americanCoffeeFactory = new SimpleAmericanCoffeeFactory();
CoffeeShop americanCoffeeShop = new CoffeeShop(americanCoffeeFactory);
americanCoffeeShop.orderCoffee(CoffeeType.CAPPUCCINO);
}
}
ہم نے دو مختلف کافی شاپس بنائیں، ہر ایک کو مطلوبہ فیکٹری منتقل کر دی۔ ایک طرف، ہم نے اپنا مقصد پورا کر لیا ہے، لیکن دوسری طرف... کسی نہ کسی طرح یہ کاروباری حضرات کے لیے ٹھیک نہیں ہے... آئیے معلوم کریں کہ کیا غلط ہے۔ سب سے پہلے، فیکٹریوں کی کثرت. کیا؟ اب ہر نئی جگہ کے لیے، ہمیں اس کی اپنی فیکٹری بنانے کی ضرورت ہے اور اس کے علاوہ، اس بات کو یقینی بنانا ہے کہ کافی شاپ بناتے وقت متعلقہ فیکٹری کو کنسٹرکٹر کو دیا جائے؟ دوسرا، یہ اب بھی ایک سادہ فیکٹری ہے. بس تھوڑا سا جدید بنایا۔ لیکن ہم یہاں ایک نیا نمونہ سیکھنے آئے ہیں۔ تیسرا، کیا ایک مختلف نقطہ نظر ممکن نہیں ہے؟ یہ بہت اچھا ہو گا اگر ہم کافی کی تیاری سے متعلق تمام مسائل کو کلاس میں کافی بنانے اور سروسنگ آرڈرز کو جوڑنے کے ساتھ ساتھ کافی کے مختلف اسٹائل بنانے کے لیے کافی لچک برقرار رکھتے ہوئے شامل کر سکیں CoffeeShop
۔ جواب ہے ہاں، ہم کر سکتے ہیں۔ اسے فیکٹری طریقہ ڈیزائن پیٹرن کہا جاتا ہے۔
ایک سادہ فیکٹری سے فیکٹری کے طریقہ کار تک
کام کو ہر ممکن حد تک مؤثر طریقے سے حل کرنے کے لیے:- ہم
createCoffee(CoffeeType type)
طریقہ کو کلاس میں واپس کرتے ہیںCoffeeShop
۔ - ہم اس طریقہ کو خلاصہ بنائیں گے۔
- کلاس
CoffeeShop
خود ہی خلاصہ بن جائے گی۔ - کلاس
CoffeeShop
میں بچوں کی کلاسیں ہوں گی۔
CoffeeShop
، جو اس createCoffee(CoffeeType type)
طریقہ کو اطالوی بارسٹاس کی بہترین روایات کے مطابق نافذ کرتی ہے۔ اب، ایک وقت میں ایک قدم۔ مرحلہ 1۔ Coffee
کلاس کو خلاصہ بنائیں۔ ہمارے پاس مختلف مصنوعات کے دو پورے خاندان ہیں۔ پھر بھی، اطالوی اور امریکی کافیوں کا ایک مشترکہ اجداد ہے - کلاس Coffee
۔ اسے خلاصہ بنانا مناسب ہوگا:
public abstract class Coffee {
public void makeCoffee(){
// Brew the coffee
}
public void pourIntoCup(){
// Pour into a cup
}
}
مرحلہ 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("Here's your coffee! Thanks! Come again!");
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);
}
}
مبارک ہو ہم نے صرف اپنی کافی شاپ کو مثال کے طور پر استعمال کرتے ہوئے فیکٹری میتھڈ ڈیزائن پیٹرن کو نافذ کیا۔
فیکٹری طریقوں کے پیچھے اصول
اب آئیے مزید تفصیل سے غور کریں کہ ہمیں کیا ملا۔ نیچے دیا گیا خاکہ نتیجہ خیز کلاسز کو دکھاتا ہے۔ سبز بلاکس تخلیق کار کلاسز ہیں، اور نیلے بلاکس پروڈکٹ کلاسز ہیں۔
- تمام پروڈکٹس خلاصہ
Coffee
کلاس کے نفاذ ہیں۔ - تمام تخلیق کار تجریدی
CoffeeShop
طبقے کے نفاذ ہیں۔ - ہم دو متوازی طبقاتی درجہ بندی دیکھتے ہیں:
- مصنوعات کا درجہ بندی۔ ہم اطالوی اولاد اور امریکی اولاد دیکھتے ہیں۔
- تخلیق کاروں کا درجہ بندی۔ ہم اطالوی اولاد اور امریکی اولاد دیکھتے ہیں۔
- سپر
CoffeeShop
کلاس کے پاس اس بارے میں کوئی معلومات نہیں ہے کہ کون سا مخصوص پروڈکٹ (Coffee
) بنایا جائے گا۔ - سپر
CoffeeShop
کلاس ایک مخصوص پروڈکٹ کی تخلیق کو اس کی اولاد کو سونپتا ہے۔ - طبقے کا ہر اولاد اپنی مخصوص خصوصیات کے مطابق
CoffeeShop
ایک فیکٹری طریقہ نافذ کرتا ہے ۔createCoffee()
دوسرے لفظوں میں، پروڈیوسر کلاسز کے نفاذ سے پروڈیوسر کلاس کی خصوصیات کی بنیاد پر مخصوص مصنوعات تیار ہوتی ہیں۔
فیکٹری کے طریقہ کار کی ساخت

- تخلیق کار کلاس تمام طریقوں کو لاگو کرتی ہے جو مصنوعات کے ساتھ تعامل کرتے ہیں، سوائے فیکٹری کے طریقہ کے۔
- تجریدی
factoryMethod()
طریقہ کو کلاس کی تمام اولادوں کے ذریعہ لاگو کیا جانا چاہئےCreator
۔ - کلاس طریقہ کو
ConcreteCreator
نافذ کرتی ہےfactoryMethod()
، جو براہ راست پروڈکٹ کو تخلیق کرتی ہے۔ - یہ کلاس مخصوص مصنوعات بنانے کے لیے ذمہ دار ہے۔ یہ واحد کلاس ہے جس میں ان مصنوعات کو بنانے کے بارے میں معلومات ہیں۔
- تمام پروڈکٹس کو ایک مشترکہ انٹرفیس نافذ کرنا چاہیے، یعنی وہ ایک مشترکہ پروڈکٹ کلاس کی اولاد ہونے چاہئیں۔ یہ ضروری ہے تاکہ مصنوعات استعمال کرنے والی کلاسیں مخصوص نفاذ کے بجائے ان پر تجرید کے طور پر کام کر سکیں۔
GO TO FULL VERSION