CodeGym /Java Blog /এলোমেলো /কারখানা নকশা প্যাটার্ন
John Squirrels
লেভেল 41
San Francisco

কারখানা নকশা প্যাটার্ন

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

একটি কারখানা কি?

ফ্যাক্টরি ডিজাইন প্যাটার্ন আপনাকে বস্তুর সৃষ্টি নিয়ন্ত্রণ করতে দেয়। একটি নতুন বস্তু তৈরি করার প্রক্রিয়াটি খুব সহজ নয়, তবে এটি অত্যধিক জটিলও নয়। আমরা সবাই জানি যে newএকটি নতুন বস্তু তৈরি করতে আমাদের অপারেটরের প্রয়োজন। সম্ভবত এটা মনে হয় যে এখানে নিয়ন্ত্রণ করার কিছু নেই, কিন্তু এটি সত্য নয়। ধরুন আমাদের অ্যাপ্লিকেশনের একটি নির্দিষ্ট শ্রেণী রয়েছে যার অনেক বংশধর রয়েছে। যখন নির্দিষ্ট শর্তের উপর নির্ভর করে একটি নির্দিষ্ট শ্রেণীর একটি উদাহরণ তৈরি করা প্রয়োজন তখন অসুবিধা দেখা দিতে পারে। একটি কারখানা একটি নকশা প্যাটার্ন যা নির্দিষ্ট শর্তের উপর নির্ভর করে বিভিন্ন বস্তু তৈরির সমস্যা সমাধানে সহায়তা করে। কিভাবে একটি বিমূর্ত ধারণা জন্য যে? যখন আমরা নীচের উদাহরণটি দেখি তখন এটি আরও পরিষ্কার এবং আরও নির্দিষ্ট হয়ে যাবে।

চলুন বিভিন্ন ধরনের কফি প্রস্তুত করা যাক

ধরুন আমরা একটি কফি শপ স্বয়ংক্রিয় করতে চাই। আমাদের প্রোগ্রাম শেখাতে হবে কিভাবে বিভিন্ন ধরনের কফি তৈরি করতে হয়। এটি করার জন্য, আমরা একটি কফি ক্লাস এবং কয়েকটি ডেরিভেটিভ ক্লাস তৈরি করব যা আমরা প্রস্তুত করব এমন কফির প্রতিনিধিত্ব করতে: আমেরিকানো, ক্যাপুচিনো, এসপ্রেসো এবং ল্যাটে। একটি সাধারণ কফি ক্লাস দিয়ে শুরু করা যাক:

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 {}
আমাদের গ্রাহকরা যেকোনো ধরনের কফি অর্ডার করতে পারেন। তাদের আদেশ প্রোগ্রাম পাস করা প্রয়োজন. এটি অনেক উপায়ে করা যেতে পারে, উদাহরণস্বরূপ, ব্যবহার করে String। কিন্তু একটি enumএই জন্য সেরা. আমরা একটি enumএনাম ক্ষেত্র তৈরি করব এবং সংজ্ঞায়িত করব যা অর্ডার করা যেতে পারে এমন কফির প্রকারের সাথে সামঞ্জস্যপূর্ণ:

public enum CoffeeType {
    ESPRESSO,
    AMERICANO,
    CAFFE_LATTE,
    CAPPUCCINO
}
দারুণ। এখন আমাদের কফি শপের কোড লিখি:

public class CoffeeShop {
    
    public Coffee orderCoffee(CoffeeType type) {
        Coffee coffee = null;
        
        switch (type) {
            case AMERICANO:
                coffee = new Americano();
                break;
            case ESPRESSO:
                coffee = new Espresso();
                break;
            case CAPPUCCINO:
                coffee = new Cappucсino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }

        coffee.grindCoffee();
        coffee.makeCoffee();
        coffee.pourIntoCup();

        System.out.println("Here's your coffee! Thanks! Come again!");
        return coffee;
    }
}
পদ্ধতি orderCoffeeদুটি ভাগে ভাগ করা যেতে পারে:
  1. একটি বিবৃতিতে কফির একটি নির্দিষ্ট উদাহরণ তৈরি করা switch। এখানেই একটি কারখানা যা করে তা করে — শর্তের উপর নির্ভর করে একটি নির্দিষ্ট প্রকার তৈরি করুন।
  2. প্রস্তুতি - এটি একটি কাপে নাকাল, বানানো এবং ঢালা।
ভবিষ্যতে আপনাকে পদ্ধতিতে পরিবর্তন করতে হবে কিনা তা জানা গুরুত্বপূর্ণ:
  1. প্রস্তুতির সাথে জড়িত পদক্ষেপগুলি (নাকাল, পান করা এবং একটি কাপে ঢালা) অপরিবর্তিত থাকবে (অন্তত আমরা এটির উপর নির্ভর করছি)।
  2. কিন্তু কফির ভাণ্ডার পরিবর্তন হতে পারে। হয়তো আমরা মোচা বানানো শুরু করব... ফ্রেপু... মোচাচি... যাই হোক, একটা নতুন ধরনের কফি।
আমরা ইতিমধ্যেই মোটামুটি আত্মবিশ্বাসী হতে পারি যে ভবিষ্যতে আমাদের পদ্ধতির বিবৃতিতে পরিবর্তন আনতে হবে switch। এটাও সম্ভব যে আমাদের কফি শপে orderCoffeeপদ্ধতিটি একমাত্র জায়গা হবে না যেখানে আমরা বিভিন্ন ধরনের কফি তৈরি করব। ফলে বেশ কিছু জায়গায় পরিবর্তন আনতে হবে। আপনি সম্ভবত ইতিমধ্যে বুঝতে পারছেন আমি কি পেতে. আমরা রিফ্যাক্টর প্রয়োজন. দুটি কারণে কফি তৈরির জন্য দায়ী ব্লকটিকে একটি পৃথক ক্লাসে সরান:
  1. আমরা অন্য জায়গায় কফি তৈরির যুক্তি পুনরায় ব্যবহার করতে পারি।
  2. যদি ভাণ্ডার পরিবর্তিত হয়, যেখানে কফি তৈরি হয় সেখানে আমাদের কোডটি সম্পাদনা করতে হবে না। শুধুমাত্র একটি জায়গায় আমাদের কোড পরিবর্তন করা যথেষ্ট হবে।
অর্থাৎ কারখানা স্থাপনের সময় এসেছে।

আমাদের প্রথম কারখানা স্থাপন করা হচ্ছে

এটি করার জন্য, আমরা একটি নতুন ক্লাস তৈরি করব যা শুধুমাত্র কফি ক্লাসের প্রয়োজনীয় দৃষ্টান্ত তৈরি করার জন্য দায়ী হবে:

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 Cappucino();
                break;
            case CAFFE_LATTE:
                coffee = new CaffeLatte();
                break;
        }
        
        return coffee;
    }
}
অভিনন্দন! আমরা সবেমাত্র ফ্যাক্টরি ডিজাইন প্যাটার্নটি তার সহজতম আকারে (প্রায়) প্রয়োগ করেছি। আমরা যদি পদ্ধতিটিকে স্থির করে দিতাম তবে এটি আরও সহজ হতে পারত createCoffee। কিন্তু তারপর আমরা দুটি ক্ষমতা হারাবো:
  1. SimpleCoffeeFactoryপদ্ধতির উত্তরাধিকার এবং ওভাররাইড করার ক্ষমতা createCoffee
  2. আমাদের ক্লাসে প্রয়োজনীয় কারখানা বাস্তবায়ন যোগ করার ক্ষমতা।
যাইহোক, বাস্তবায়নের কথা বলছি... আমাদের কফি শপে ফিরে যেতে হবে এবং আমাদের কফি তৈরির কারখানা যোগ করতে হবে।

কফি শপে একটি কারখানা যোগ করা হচ্ছে

আসুন একটি কারখানা ব্যবহার করে কফি শপের ক্লাসটি আবার লিখি:

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;
    }
}
চমৎকার। এখন আমরা কারখানার নকশা প্যাটার্নের সাধারণ কাঠামোর একটি সংক্ষিপ্ত বিবরণ প্রদান করব।

আপনার নিজস্ব কারখানা খোলার জন্য 5 ধাপ

ধাপ 1. নীচের চিত্রের মতো আপনার প্রোগ্রামে বেশ কয়েকটি বংশধর সহ একটি ক্লাস রয়েছে: কারখানা নকশা প্যাটার্ন - 2ধাপ 2। আপনি enumপ্রতিটি শিশু শ্রেণীর জন্য একটি ক্ষেত্র তৈরি করুন:

    enum CatType {
        LION,
        TIGER,
        FLUFFY
    }
ধাপ 3. আপনার কারখানা তৈরি করুন। এটা কল CatFactory. এখানে কোড আছে:

class CatFactory {}
ধাপ 4. আপনার কারখানায়, একটি যুক্তি তৈরি createCatকরুন CatType। এখানে কোড আছে:

    class CatFactory {
        public Cat createCat(CatType type) {
            
        }
    }
ধাপ 5. পদ্ধতির মূল অংশে, একটি switchবিবৃতি লিখুন যা enum ক্ষেত্রগুলি গণনা করে এবং ক্লাসের একটি উদাহরণ তৈরি করে যা পাস করা enumমানের সাথে মিলে যায়:

class CatFactory {
        public Cat createCat(CatType type) {
            Cat cat = null;
            
            switch (type) {
                case LION:
                    cat =  new Fluffy();
                    break;
                case TIGER:
                    cat = new Tiger();
                    break;
                case FLUFFY:
                    cat =  new Lion();
                    break;
            }
            
            return cat;
        }
    }
এখন আপনি বসের মতো কারখানা চালাতে পারেন। :)

কিভাবে অনুশীলন করবেন

পড়া ভাল, কোড লেখা আরও ভাল। আপনার নামের অক্ষর সংখ্যা একটি সমান থাকলে, আপনার নিজস্ব ভার্চুয়াল পিজারিয়া তৈরি করার চেষ্টা করুন। আপনার নামের বিজোড় সংখ্যক অক্ষর থাকলে, একটি ভার্চুয়াল সুশি বার তৈরি করার চেষ্টা করুন। যদি আপনার কোন নাম না থাকে তবে আপনি ভাগ্যবান। আজ আপনি আরাম করতে পারেন।
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION