ওহে! আজ আমরা ডিজাইন প্যাটার্ন অধ্যয়ন চালিয়ে যাব এবং আমরা বিমূর্ত ফ্যাক্টরি প্যাটার্ন নিয়ে আলোচনা করব।
আমরা পাঠে যা কভার করব তা এখানে:
এখন আমরা এই নির্দেশাবলী অনুযায়ী কোড লিখব:

- আমরা আলোচনা করব একটি বিমূর্ত কারখানা কী এবং এই প্যাটার্নটি কী সমস্যার সমাধান করে
- আমরা একটি ব্যবহারকারী ইন্টারফেসের মাধ্যমে কফি অর্ডার করার জন্য একটি ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশনের কঙ্কাল তৈরি করব
- এই প্যাটার্নটি কীভাবে ব্যবহার করতে হয় তার নির্দেশাবলী আমরা অধ্যয়ন করব, একটি ডায়াগ্রাম এবং কোড দেখা সহ
- এবং একটি বোনাস হিসাবে, এই পাঠে একটি লুকানো ইস্টার ডিম রয়েছে যা আপনাকে অপারেটিং সিস্টেমের নাম নির্ধারণ করতে এবং ফলাফলের উপর নির্ভর করে একটি অন্য কাজ বা অন্য কাজ সম্পাদন করতে জাভা ব্যবহার করতে শিখতে সাহায্য করবে।
- জাভাতে উত্তরাধিকার
- জাভাতে বিমূর্ত ক্লাস এবং পদ্ধতি
একটি বিমূর্ত কারখানা কোন সমস্যা সমাধান করে?
একটি বিমূর্ত কারখানা, সমস্ত কারখানার নিদর্শনগুলির মতো, নতুন বস্তুগুলি সঠিকভাবে তৈরি করা নিশ্চিত করতে আমাদের সাহায্য করে। আমরা আন্তঃসংযুক্ত বস্তুর বিভিন্ন পরিবারের "উৎপাদন" পরিচালনা করতে এটি ব্যবহার করি। আন্তঃসংযুক্ত বস্তুর বিভিন্ন পরিবার... এর মানে কি? চিন্তা করবেন না: বাস্তবে, সবকিছু মনে হতে পারে তার চেয়ে সহজ। শুরুতে, আন্তঃসংযুক্ত বস্তুর একটি পরিবার কী হতে পারে? ধরুন আমরা একটি সামরিক কৌশল তৈরি করছি যাতে বিভিন্ন ধরনের ইউনিট জড়িত থাকে:- পদাতিক
- অশ্বারোহী
- তীরন্দাজ
আমাদের কফি শপ স্বয়ংক্রিয়ভাবে চালিয়ে যাওয়া যাক
শেষ পাঠে, আমরা কারখানা পদ্ধতি প্যাটার্ন অধ্যয়ন. আমরা আমাদের কফি ব্যবসা প্রসারিত করতে এবং বেশ কয়েকটি নতুন অবস্থান খুলতে এটি ব্যবহার করেছি। আজ আমরা আমাদের ব্যবসার আধুনিকায়ন চালিয়ে যাব। বিমূর্ত ফ্যাক্টরি প্যাটার্ন ব্যবহার করে, আমরা অনলাইনে কফি অর্ডার করার জন্য একটি নতুন ডেস্কটপ অ্যাপ্লিকেশনের ভিত্তি স্থাপন করব। একটি ডেস্কটপ অ্যাপ্লিকেশন লেখার সময়, আমাদের সবসময় ক্রস-প্ল্যাটফর্ম সমর্থন সম্পর্কে চিন্তা করা উচিত। আমাদের অ্যাপ্লিকেশন অবশ্যই ম্যাকওএস এবং উইন্ডোজ উভয় ক্ষেত্রেই কাজ করবে (স্পয়লার: লিনাক্সের জন্য সমর্থন আপনার হোমওয়ার্ক হিসাবে প্রয়োগ করার জন্য রেখে দেওয়া হয়েছে)। আমাদের আবেদন কেমন হবে? বেশ সহজ: এটি একটি পাঠ্য ক্ষেত্র, একটি নির্বাচন ক্ষেত্র এবং একটি বোতাম সমন্বিত একটি ফর্ম হবে৷ আপনার যদি বিভিন্ন অপারেটিং সিস্টেম ব্যবহার করার অভিজ্ঞতা থাকে তবে আপনি অবশ্যই লক্ষ্য করেছেন যে উইন্ডোজের বোতামগুলি ম্যাকের চেয়ে আলাদাভাবে রেন্ডার করা হয়। অন্য সবকিছুর মতো... আচ্ছা, শুরু করা যাক।- বোতাম
- পাঠ্য ক্ষেত্র
- নির্বাচন ক্ষেত্র
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 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-এর জন্য বিশেষভাবে তৈরি করা হয়। আমরা যা তৈরি করেছি তা সংক্ষেপে পুনরাবৃত্তি করব:
- একটি ইনপুট ক্ষেত্র, একটি নির্বাচন ক্ষেত্র এবং একটি বোতাম নিয়ে গঠিত একটি পণ্য পরিবার৷
- Windows এবং 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