CodeGym /Java Blog /এলোমেলো /নকশা নিদর্শন: বিমূর্ত কারখানা
John Squirrels
লেভেল 41
San Francisco

নকশা নিদর্শন: বিমূর্ত কারখানা

এলোমেলো দলে প্রকাশিত
ওহে! আজ আমরা ডিজাইন প্যাটার্ন অধ্যয়ন চালিয়ে যাব এবং আমরা বিমূর্ত ফ্যাক্টরি প্যাটার্ন নিয়ে আলোচনা করব। ডিজাইন প্যাটার্ন: বিমূর্ত কারখানা - 1আমরা পাঠে যা কভার করব তা এখানে:
  • আমরা আলোচনা করব একটি বিমূর্ত কারখানা কী এবং এই প্যাটার্নটি কী সমস্যার সমাধান করে
  • আমরা একটি ব্যবহারকারী ইন্টারফেসের মাধ্যমে কফি অর্ডার করার জন্য একটি ক্রস-প্ল্যাটফর্ম অ্যাপ্লিকেশনের কঙ্কাল তৈরি করব
  • এই প্যাটার্নটি কীভাবে ব্যবহার করতে হয় তার নির্দেশাবলী আমরা অধ্যয়ন করব, একটি ডায়াগ্রাম এবং কোড দেখা সহ
  • এবং একটি বোনাস হিসাবে, এই পাঠে একটি লুকানো ইস্টার ডিম রয়েছে যা আপনাকে অপারেটিং সিস্টেমের নাম নির্ধারণ করতে এবং ফলাফলের উপর নির্ভর করে একটি অন্য কাজ বা অন্য কাজ সম্পাদন করতে জাভা ব্যবহার করতে শিখতে সাহায্য করবে।
এই প্যাটার্নটি সম্পূর্ণরূপে বোঝার জন্য, আপনাকে নিম্নলিখিত বিষয়গুলিতে ভালভাবে পারদর্শী হতে হবে:
  • জাভাতে উত্তরাধিকার
  • জাভাতে বিমূর্ত ক্লাস এবং পদ্ধতি

একটি বিমূর্ত কারখানা কোন সমস্যা সমাধান করে?

একটি বিমূর্ত কারখানা, সমস্ত কারখানার নিদর্শনগুলির মতো, নতুন বস্তুগুলি সঠিকভাবে তৈরি করা নিশ্চিত করতে আমাদের সাহায্য করে। আমরা আন্তঃসংযুক্ত বস্তুর বিভিন্ন পরিবারের "উৎপাদন" পরিচালনা করতে এটি ব্যবহার করি। আন্তঃসংযুক্ত বস্তুর বিভিন্ন পরিবার... এর মানে কি? চিন্তা করবেন না: বাস্তবে, সবকিছু মনে হতে পারে তার চেয়ে সহজ। শুরুতে, আন্তঃসংযুক্ত বস্তুর একটি পরিবার কী হতে পারে? ধরুন আমরা একটি সামরিক কৌশল তৈরি করছি যাতে বিভিন্ন ধরনের ইউনিট জড়িত থাকে:
  • পদাতিক
  • অশ্বারোহী
  • তীরন্দাজ
এই ধরনের ইউনিট পরস্পর সংযুক্ত, কারণ তারা একই সেনাবাহিনীতে কাজ করে। আমরা বলতে পারি যে উপরে তালিকাভুক্ত বিভাগগুলি আন্তঃসংযুক্ত বস্তুর একটি পরিবার। আমরা এই বুঝি। কিন্তু বিমূর্ত কারখানা প্যাটার্ন ব্যবহার করা হয় আন্তঃসংযুক্ত বস্তুর বিভিন্ন পরিবার তৈরির ব্যবস্থা করতে। এখানেও জটিল কিছু নেই। এর সামরিক কৌশল উদাহরণ দিয়ে অবিরত করা যাক. সাধারণভাবে বলতে গেলে, সামরিক ইউনিটগুলি বিভিন্ন যুদ্ধরত দলের অন্তর্গত। তারা কার পক্ষে রয়েছে তার উপর নির্ভর করে, সামরিক ইউনিটগুলি চেহারায় উল্লেখযোগ্যভাবে পরিবর্তিত হতে পারে। রোমান সেনাবাহিনীর পদাতিক সৈন্য, ঘোড়সওয়ার এবং তীরন্দাজ ভাইকিং পদাতিক সৈন্য, ঘোড়সওয়ার এবং তীরন্দাজদের মতো নয়। সামরিক কৌশলে, বিভিন্ন সেনাবাহিনীর সৈন্যরা আন্তঃসম্পর্কিত বস্তুর বিভিন্ন পরিবার। এটা মজার হবে যদি একজন প্রোগ্রামার' এই ভুলের কারণে একজন সৈনিক নেপোলিয়ন-যুগের ফরাসি ইউনিফর্ম, প্রস্তুত মাস্কেট, রোমান পদাতিক বাহিনীর মধ্যে হাঁটতে দেখা যায়। বিমূর্ত কারখানা নকশা প্যাটার্ন এই সমস্যা সমাধানের জন্য অবিকল প্রয়োজন. না, টাইম ট্রাভেল থেকে আসতে পারে এমন বিব্রতকর সমস্যা নয়, বরং আন্তঃসংযুক্ত বস্তুর বিভিন্ন গ্রুপ তৈরির সমস্যা। একটি বিমূর্ত কারখানা সমস্ত উপলব্ধ পণ্য (বস্তুর একটি পরিবার) তৈরি করার জন্য একটি ইন্টারফেস প্রদান করে। একটি বিমূর্ত কারখানায় সাধারণত একাধিক বাস্তবায়ন থাকে। তাদের প্রত্যেকেই পরিবারের একজনের পণ্য তৈরির জন্য দায়ী। আমাদের সামরিক কৌশল একটি বিমূর্ত কারখানা অন্তর্ভুক্ত করবে যা বিমূর্ত পাদদেশ সৈন্য, তীরন্দাজ এবং অশ্বারোহী তৈরি করে, সেইসাথে এই কারখানার বাস্তবায়ন। উদাহরণ স্বরূপ, একটি কারখানা যা রোমান লেজিওনিয়ার তৈরি করে এবং একটি কারখানা যা কার্থাজিনিয়ান সৈন্য তৈরি করে। বিমূর্ততা এই প্যাটার্নের সবচেয়ে গুরুত্বপূর্ণ গাইডিং নীতি। কারখানার ক্লায়েন্টরা কারখানা এবং এর পণ্যগুলির সাথে শুধুমাত্র বিমূর্ত ইন্টারফেসের মাধ্যমে কাজ করে। ফলস্বরূপ, বর্তমানে কোন সৈন্য তৈরি করা হচ্ছে তা নিয়ে আপনাকে ভাবতে হবে না। পরিবর্তে, আপনি বিমূর্ত কারখানার কিছু কংক্রিট বাস্তবায়নের কাছে এই দায়িত্বটি দিয়ে যান।

আমাদের কফি শপ স্বয়ংক্রিয়ভাবে চালিয়ে যাওয়া যাক

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

বিমূর্ত কারখানা: কীভাবে ব্যবহার করবেন

একটি বিমূর্ত কারখানা হল কংক্রিট পণ্য শ্রেণীর সাথে আবদ্ধ না হয়ে বিভিন্ন পণ্য পরিবার তৈরির পরিচালনার জন্য একটি নকশা প্যাটার্ন। এই প্যাটার্ন ব্যবহার করার সময়, আপনাকে অবশ্যই:
  1. পণ্য পরিবার সংজ্ঞায়িত করুন। ধরুন আমাদের দুটি আছে:
    • SpecificProductA1,SpecificProductB1
    • SpecificProductA2,SpecificProductB2
  2. পরিবারের মধ্যে প্রতিটি পণ্যের জন্য, একটি বিমূর্ত শ্রেণী (ইন্টারফেস) সংজ্ঞায়িত করুন। আমাদের ক্ষেত্রে, আমাদের আছে:
    • ProductA
    • ProductB
  3. প্রতিটি পণ্য পরিবারের মধ্যে, প্রতিটি পণ্যকে অবশ্যই ধাপ 2 এ সংজ্ঞায়িত ইন্টারফেস বাস্তবায়ন করতে হবে।
  4. ধাপ 2 এ সংজ্ঞায়িত প্রতিটি পণ্য তৈরির পদ্ধতি সহ একটি বিমূর্ত কারখানা তৈরি করুন। আমাদের ক্ষেত্রে, এই পদ্ধতিগুলি হবে:
    • ProductA createProductA();
    • ProductB createProductB();
  5. বিমূর্ত কারখানা বাস্তবায়ন তৈরি করুন যাতে প্রতিটি বাস্তবায়ন একটি একক পরিবারের পণ্য তৈরি নিয়ন্ত্রণ করে। এটি করার জন্য, বিমূর্ত কারখানার প্রতিটি বাস্তবায়নের ভিতরে, আপনাকে সমস্ত সৃষ্টি পদ্ধতি প্রয়োগ করতে হবে যাতে তারা নির্দিষ্ট পণ্য বাস্তবায়ন তৈরি করে এবং ফেরত দেয়।
নিচের UML ডায়াগ্রামটি উপরে বর্ণিত নির্দেশাবলীকে চিত্রিত করে: নকশা নিদর্শন: বিমূর্ত কারখানা - 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