Factory — একটি সৃষ্টিমূলক প্যাটার্ন যা অবজেক্ট তৈরি ফ্যাক্টরি মেথডগুলিতে অর্পণ করে। মোবাইল ডেভেলপমেন্টে, Factory Method এবং Abstract Factory ব্যবহার করা হয় ViewModel, NetworkClient, Repository এবং অন্যান্য নির্ভরতা তৈরি করতে। Factory ইনস্ট্যান্সিয়েশন লজিককে আলাদা করে, বাস্তবায়ন পরিবর্তন সহজ করে তোলে। আরও বিস্তারিত — Refactoring Guru: Factory Method-এ।
মূল বিষয়
Factory — GoF ক্যাটালগের একটি সৃষ্টিমূলক ডিজাইন প্যাটার্ন। মূল ধারণা: অবজেক্ট তৈরির লজিক ক্লায়েন্ট কোড থেকে আলাদা মেথড বা ক্লাসে সরানো। ক্লায়েন্ট একটি ইন্টারফেস বা অ্যাবস্ট্র্যাক্ট ক্লাসের সাথে কাজ করে, যখন কংক্রিট বাস্তবায়ন ফ্যাক্টরি দ্বারা তৈরি হয়। এটি ডিপেন্ডেন্সি ইনভার্সন নীতি বাস্তবায়ন করে: ক্লায়েন্ট কংক্রিট ক্লাসের উপর নয়, শুধুমাত্র অ্যাবস্ট্রাকশনের উপর নির্ভর করে।
দুটি প্রকার Factory-এর: Factory Method এবং Abstract Factory। Factory Method — একটি ক্লাসে একটি মেথড যা সাবক্লাসগুলি অবজেক্ট তৈরির জন্য ওভাররাইড করে। Abstract Factory — পরস্পর সম্পর্কিত অবজেক্টের গ্রুপ তৈরির জন্য ফ্যাক্টরি মেথডের পরিবারসহ একটি ইন্টারফেস। উভয় প্রকার একই সমস্যা সমাধান করে: ক্লায়েন্ট সরাসরি new MyClass() কল করে না, বরং ফ্যাক্টরিকে তার টাইপ বা প্যারামিটার অনুযায়ী অবজেক্ট তৈরি করতে বলে।
Factory vs new() — সরাসরি অবজেক্ট তৈরি কোডকে একটি কংক্রিট বাস্তবায়নের সাথে শক্তভাবে সংযুক্ত করে। Factory একটি স্তর যোগ করে: বাস্তবায়ন পরিবর্তনের জন্য শুধুমাত্র ফ্যাক্টরিতে সম্পাদনা প্রয়োজন, সমস্ত ক্লায়েন্টে নয়। মোবাইল ডেভেলপমেন্টে, Factory সক্রিয়ভাবে ViewModel (ViewModelProvider.Factory), নেটওয়ার্ক ক্লায়েন্ট (Retrofit.create()), লিস্ট অ্যাডাপ্টার এবং সিরিয়ালাইজেশন ফ্যাক্টরি তৈরি করতে ব্যবহৃত হয়। DI কন্টেইনার (Dagger, Koin) স্বয়ংক্রিয়ভাবে ফ্যাক্টরি তৈরি করে।
Factory Method — একটি প্রোটোকল বা অ্যাবস্ট্র্যাক্ট ক্লাসে ঘোষিত মেথড যা একটি নির্দিষ্ট টাইপের অবজেক্ট ফেরত দেয়। সাবক্লাসগুলি মেথড বাস্তবায়ন করে, কংক্রিট ইনস্ট্যান্স তৈরি করে। Swift-এ, এটি প্রোটোকলে স্ট্যাটিক মেথড বা বেস ক্লাসে মেথড হতে পারে। Kotlin-এ — ফ্যাক্টরি মেথডসহ companion object বা অ্যাবস্ট্র্যাক্ট ক্লাসে open fun। প্যাটার্নটি ব্যাপকভাবে পার্সার, ত্রুটি ফ্যাক্টরি এবং কোয়েরি বিল্ডার তৈরিতে ব্যবহৃত হয়।
protocol PaymentGateway {
func processPayment(amount: Decimal) async throws -> PaymentResult
}
final class StripeGateway: PaymentGateway { /* ... */ }
final class ApplePayGateway: PaymentGateway { /* ... */ }
enum PaymentType { case stripe, applePay }
final class PaymentFactory {
// Factory Method
static func create(type: PaymentType) -> PaymentGateway {
switch type {
case .stripe: return StripeGateway()
case .applePay: return ApplePayGateway()
}
}
}
// ব্যবহার
let gateway = PaymentFactory.create(type: .stripe)
Kotlin সংস্করণ Factory Method টাইপ সীমিত করতে companion object বা sealed class ব্যবহার করে। Sealed class নিশ্চিত করে যে when শাখা সমস্ত সম্ভাব্য টাইপ কভার করে — কম্পাইলার সম্পূর্ণতা পরীক্ষা করে। এটি Android প্রকল্পের জন্য সাধারণ যেখানে ফ্যাক্টরি build flavour বা কনফিগারেশনের উপর ভিত্তি করে বিভিন্ন Repository বা DataSource বাস্তবায়ন তৈরি করে।
sealed class PaymentType {
object Stripe : PaymentType()
object ApplePay : PaymentType()
}
interface PaymentGateway {
suspend fun processPayment(amount: BigDecimal): PaymentResult
}
class PaymentFactory {
companion object {
fun create(type: PaymentType): PaymentGateway = when (type) {
PaymentType.Stripe -> StripeGateway()
PaymentType.ApplePay -> ApplePayGateway()
}
}
}
Abstract Factory — তাদের কংক্রিট ক্লাস উল্লেখ না করেই পরস্পর সম্পর্কিত বা পরস্পর নির্ভরশীল অবজেক্টের পরিবার তৈরির জন্য একটি প্যাটার্ন। ক্লায়েন্ট অ্যাবস্ট্র্যাক্ট ফ্যাক্টরি ইন্টারফেসের সাথে কাজ করে, যা পরিবারের প্রতিটি পণ্য তৈরির জন্য মেথড নির্ধারণ করে। একটি কংক্রিট ফ্যাক্টরি ইন্টারফেস বাস্তবায়ন করে এবং একটি নির্দিষ্ট ভেরিয়েন্টের অবজেক্ট তৈরি করে। উদাহরণস্বরূপ, iOS-এর জন্য UI কম্পোনেন্ট ফ্যাক্টরি UIButton, UILabel, UITableView তৈরি করে, যখন Android-এর জন্য — Button, TextView, RecyclerView.
Abstract Factory vs Factory Method — Factory Method ইনহেরিটেন্সের মাধ্যমে একটি টাইপের অবজেক্ট তৈরি করে, Abstract Factory কম্পোজিশনের মাধ্যমে অবজেক্টের পরিবার তৈরি করে। Factory Method সাবক্লাসে ওভাররাইড করা হয়, Abstract Factory একটি প্রোটোকলের মাধ্যমে একাধিক ফ্যাক্টরি মেথড সরবরাহ করে। Abstract Factory-তে প্রায়ই একাধিক Factory Method থাকে। মোবাইল ডেভেলপমেন্টে, Abstract Factory প্ল্যাটফর্ম-নির্ভর কম্পোনেন্ট, থিম ডিজাইন এবং ডাটাবেস ফ্যাক্টরির জন্য ব্যবহৃত হয়।
| বৈশিষ্ট্য | Factory Method | Abstract Factory |
|---|---|---|
| পণ্যের সংখ্যা | এক | পরিবার (একাধিক) |
| পদ্ধতি | ইনহেরিটেন্স (override) | কম্পোজিশন (প্রোটোকল/ইন্টারফেস) |
| iOS উদাহরণ | PaymentFactory.create() | iOS/Android-এর জন্য UIComponentFactory |
| Android উদাহরণ | ViewModelProvider.Factory | ThemeFactory: বাটন, টেক্সট, কার্ড তৈরি |
| নমনীয়তা | সরল সাবক্লাস প্রতিস্থাপন | সম্পূর্ণ পরিবার প্রতিস্থাপন |
বাস্তব উদাহরণ Android-এ Abstract Factory — একটি একক DatabaseFactory ইন্টারফেসের মাধ্যমে বিভিন্ন ডাটাবেস টাইপের (SQLite vs Room) বাস্তবায়ন। ফ্যাক্টরি DAO অবজেক্ট, মাইগ্রেশন এবং কানেকশন পুল তৈরি করে। iOS-এ — বিভিন্ন পরিবেশের (Development/Staging/Production) জন্য সার্ভিস ফ্যাক্টরি। Abstract Factory সরাসরি খুব কমই ব্যবহৃত হয় — এর কার্যাবলী DI কন্টেইনার (Dagger Module, Swinject Assembly) গ্রহণ করে।
Swift Factory প্রোটোকল এবং স্ট্যাটিক মেথডের মাধ্যমে বাস্তবায়িত হয়। Factory প্রোটোকল একটি create() মেথড ঘোষণা করে যা একটি অ্যাবস্ট্র্যাক্ট টাইপ ফেরত দেয়। একটি কংক্রিট ফ্যাক্টরি প্রোটোকল বাস্তবায়ন করে এবং প্রয়োজনীয় অবজেক্ট তৈরি করে। সহজ ক্ষেত্রে Swift-এর আলাদা ফ্যাক্টরি ক্লাসের প্রয়োজন হয় না — enum বা struct-এ একটি স্ট্যাটিক মেথড যথেষ্ট। জটিল পরিস্থিতিতে, DI ইনজেকশনসহ Factory প্রোটোকল ব্যবহার করা হয়।
iOS SDK-এ Factory — অনেক সিস্টেম ফ্যাক্টরি: UIStoryboard.instantiateViewController(withIdentifier:), NSKeyedUnarchiver.unarchivedObject(ofClass:from:), JSONDecoder().decode(_:from:)। ডেভেলপাররা ViewController (StoryboardFactory), সার্ভিস (ServiceFactory) এবং ডেটা মডেলের জন্য ফ্যাক্টরি তৈরি করে। Factory Method সক্রিয়ভাবে VIPER এবং Clean Swift আর্কিটেকচারে স্ক্রিন মডিউল তৈরির জন্য ব্যবহৃত হয়।
Factory + DI — একটি আধুনিক বিকল্প: DI কন্টেইনার (Swinject, Factory) নিবন্ধিত টাইপের জন্য স্বয়ংক্রিয়ভাবে ফ্যাক্টরি তৈরি করে। কন্টেইনার অবজেক্ট তৈরির রেসিপি সংরক্ষণ করে এবং নির্ভরতা সমাধান করে। Factory লাইব্রেরি (github.com/hmlongco/Factory) স্বয়ংক্রিয় ইনজেকশনের জন্য @Injected(.service) ব্যবহার করে। DI ফ্যাক্টরিগুলি একটি লাইন দিয়ে সম্পূর্ণ মডিউল প্রতিস্থাপন করে পরীক্ষা করা হয়: container.register { MockService() }।
Android Factory — একটি ক্লাসিক উদাহরণ: প্যারামিটারসহ ViewModel তৈরির জন্য ViewModelProvider.Factory। Google স্বয়ংক্রিয় ViewModel ফ্যাক্টরি জেনারেশনের জন্য Hilt ব্যবহারের পরামর্শ দেয় — @HiltViewModel অ্যানোটেশন স্বয়ংক্রিয়ভাবে Factory তৈরি করে। সহজ অবজেক্টের জন্য, create() বা invoke() মেথডসহ companion object ব্যবহার করা হয়। Kotlin-এ, invoke অপারেটর ফ্যাক্টরিকে ফাংশনের মতো কল করার অনুমতি দেয়: Factory(param)।
Jetpack Compose-এ Factory — ফ্যাক্টরিগুলি স্টেট এবং ইফেক্ট তৈরির জন্য ব্যবহৃত হয়। remember { Factory.create() } প্রথম রেন্ডারে একটি অবজেক্ট তৈরি করে এবং composable-এর জীবনকাল জুড়ে এটি সংরক্ষণ করে। Compose-এ ViewModel viewModel() এর মাধ্যমে তৈরি হয় — এটি Hilt দ্বারা পরিচালিত একটি ফ্যাক্টরি। Compose-এ, ফ্যাক্টরিগুলি স্পষ্টভাবে কম সাধারণ, কারণ DI এবং Compose StateManager অবজেক্ট তৈরি পরিচালনা করে।
Factory vs Hilt — Dagger/Hilt কম্পাইল সময়ে স্বয়ংক্রিয়ভাবে ফ্যাক্টরি তৈরি করে। @Module + @Provides Factory Method প্রতিস্থাপন করে, @Binds Abstract Factory প্রতিস্থাপন করে। ম্যানুয়াল ফ্যাক্টরিগুলি রানটাইমে গতিশীল বাস্তবায়ন নির্বাচনের (A/B টেস্টিং, ফিচার ফ্ল্যাগ) জন্য প্রাসঙ্গিক থাকে। স্থির নির্ভরতার জন্য, Hilt সম্পূর্ণরূপে অবজেক্ট তৈরি স্বয়ংক্রিয় করে — ডেভেলপার শুধুমাত্র ইন্টারফেস এবং অ্যানোটেশন লেখে।
সচরাচর জিজ্ঞাসিত প্রশ্ন
Factory Method ইনহেরিটেন্সের মাধ্যমে এক টাইপের অবজেক্ট তৈরি করে — সাবক্লাস ফ্যাক্টরি মেথড ওভাররাইড করে। Abstract Factory কম্পোজিশনের মাধ্যমে অবজেক্টের পরিবার তৈরি করে — ফ্যাক্টরি ইন্টারফেস একাধিক পণ্যের জন্য মেথড ঘোষণা করে। Factory Method সহজ, Abstract Factory প্ল্যাটফর্ম-নির্ভর বা বিষয়ভিত্তিক কম্পোনেন্টের জন্য বেশি নমনীয়।
Factory রানটাইমে গতিশীল বাস্তবায়ন নির্বাচনের জন্য (A/B টেস্ট, ফিচার ফ্ল্যাগ, বিভিন্ন স্তরের জন্য আলাদা API) যুক্তিযুক্ত। DI (Hilt, Dagger, Koin) স্থির নির্ভরতার জন্য পছন্দনীয় — এটি তৈরি এবং ইনজেকশন স্বয়ংক্রিয় করে। Factory এবং DI পরস্পরকে বাদ দেয় না: DI একটি মডিউলের ভিতরে Factory ব্যবহার করতে পারে।
Factory একটি প্রোটোকলের মাধ্যমে ফ্যাক্টরি প্রতিস্থাপন করে পরীক্ষা করা হয়। পরীক্ষায় একটি TestFactory তৈরি করা হয় যা একই প্রোটোকল বাস্তবায়ন করে এবং mock-অবজেক্ট ফেরত দেয়। স্ট্যাটিক Factory মেথডের জন্য, পরীক্ষা আরও জটিল — এর জন্য DI কন্টেইনার বা swizzling প্রয়োজন। পরীক্ষাযোগ্যতা বজায় রাখতে সর্বদা Factory-এর জন্য প্রোটোকল ব্যবহার করার পরামর্শ দেওয়া হয়।
ViewModelProvider.Factory হল Jetpack-এর একটি ইন্টারফেস যা কাস্টম প্যারামিটারসহ ViewModel তৈরি করতে দেয়। ফ্যাক্টরি ছাড়া, ViewModel রিফ্লেকশনের মাধ্যমে তৈরি হয় এবং শুধুমাত্র খালি কনস্ট্রাক্টর থাকতে পারে। Factory প্যারামিটার (রিপজিটরি, অ্যাপ্লিকেশন কন্টেক্সট) গ্রহণ করে এবং সেগুলি ViewModel কনস্ট্রাক্টরে পাঠায়। Hilt @HiltViewModel-এর জন্য স্বয়ংক্রিয়ভাবে Factory তৈরি করে।
Factory ওপেন-ক্লোজড নীতি বাস্তবায়ন করে: সিস্টেম সম্প্রসারণের জন্য উন্মুক্ত (নতুন বাস্তবায়ন ফ্যাক্টরিতে যোগ করা হয়) কিন্তু পরিবর্তনের জন্য বন্ধ (ক্লায়েন্ট কোড পরিবর্তন হয় না)। নতুন পণ্যের টাইপ যোগ করার জন্য শুধুমাত্র ফ্যাক্টরিতে সম্পাদনা প্রয়োজন, সমস্ত ক্লায়েন্টে নয়। এটি সরাসরি অবজেক্ট তৈরির তুলনায় Factory-এর প্রধান সুবিধা।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন