7.4 Factory Pattern ব্যবহার করে ক্লাস তৈরি করা:

 

আমরা Factory Pattern সম্পর্কে জেনেছি। দেখেছি কীভাবে Factory Function ব্যবহার করতে হয়। আজ আমরা দেখব কীভাবে Factory Pattern ব্যবহার করে ক্লাস তৈরি করা যায়।

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

class CakeFactory {
   constructor(){
      this.createCake = function(flavor){
          let cake;
          if(flavor === "chocolate"){
             cake = new ChocolateCake();
          }
          else if(flavor === "biscuit"){
             cake = new BiscuitCake();
          }
          else if(flavor === "pound"){
             cake = new PoundCake();
          }
          return cake;
      }
   }
}

class ChocolateCake {
   constructor(){
      this.cakeFlavor = "Chocolate Cake";
      this.made = function (){
         console.log("You made "+this.cakeFlavor)
      }
   }
}

class BiscuitCake {
    constructor(){
      this.cakeFlavor = "Biscuit Cake";
      this.made = function (){
        console.log("You made "+this.cakeFlavor)
      }
   }
}

class PoundCake {
    constructor(){
      this.cakeFlavor = "Pound Cake";
      this.made = function (){
        console.log("You made "+this.cakeFlavor)
      }
   }
}

const cakeFactory = new CakeFactory();
const chocolate = cakeFactory.createCake("chocolate");
const pound = cakeFactory.createCake("pound");
const biscuit = cakeFactory.createCake("biscuit")
chocolate.made()                          // আউটপুটঃ You made Chocolate Cake
pound.made()                              // আউটপুটঃ You made Pound Cake
biscuit.made()                            // আউটপুটঃ You made Biscuit Cake

 

দেখতে অনেক বড় হলেও কোডটি সহজ। সবার উপরে আমরা CakeFactory নামে একটা ক্লাস তৈরি করেছি, যা একটি জেনেরিক টেম্পলেট হিসেবে কাজ করবে অন্যান্য সাবক্লাস দিয়ে অবজেক্ট তৈরি করার জন্য। মানে, ChocolateCake, PoundCake আর BiscuitCake ক্লাসগুলোকে দিয়ে অবজেক্ট তৈরি করে। CakeFactory ক্লাসের constructor এ একটি ফাংশন আছে createCake নামে যা প্যারামিটার হিসেবে flavor নেয়, যদি flavor chocolate হয় তাহলে ChocolateClass এর একটি অবজেক্ট তৈরি হবে, অন্যান্য flavor হলে অন্যান্য ক্লাসের অবজেক্ট তৈরি হবে।

এভাবেই আমরা Factory টেম্পলেট ব্যবহার করে একই রকমের আলাদা আলদা অবজেক্ট তৈরি করতে পারি।

 

উদাহরন
  • ফ্যাক্টরি প্যাটার্ন ব্যবহার করে vehicle এর জন্যে Factory ক্লাস তৈরি করা হয়েছে। যেখানে car বা truck এর অবজেক্ট তৈরি করার জন্যে আমরা Factory ক্লাস করব।
    এক্ষেত্রে Factory ক্লাস এর create মেথড এ টাইপ পাস করে দিলে মেথড টি আমদের কাঙ্ক্ষিত টাইপের অবজেক্টটি রিটার্ন করবে।
    class Car {
        constructor(options) {
            this.wheels = options.wheels;
            this.doors = options.doors;
            this.color = options.color; 
        }
    }
    
    class Truck {
        constructor(options) {
            this.wheels = options.wheels;
            this.doors = options.doors;
            this.color = options.color; 
        }
    }
    
    class Factory {
    
        constructor(type) {
            this.type = type;
        }
    
        create = (options) => {
            let vehicleType = this.type;
            let vehicle;
            
            if (vehicleType === "car") {
                vehicle = new Car(options);
            } else if (vehicleType === "truck") {
                vehicle = new Truck(options);
            }
    
            
            vehicle.vehicleType = vehicleType;
    
            vehicle.startEngine = ()=> console.log(`Reving ${vehicleType} engine`);
    
            vehicle.driveVehicle = ()=> console.log(`Driving ${vehicleType}...`);
    
            vehicle.stopEngine = ()=> console.log(`Stop ${vehicleType} engine`);
    
            return vehicle;
        }
        
    };
    
    const TruckFactory = new Factory("truck");
    const truck = TruckFactory.create({
        wheels: 12,
        doors: 2,
        color: "yellow"
    })
    
    
    console.log(truck)
    
    truck.startEngine();

     

  • ফ্যাক্টরি প্যাটার্নের আরেকটি উদাহরণঃ
    class chocolateIceCream{
      constructor() {
        console.log('chocolate')
      }
    };
    
    class vanillaIceCream{
      constructor() {
        console.log('vanilla')
      }
    };
    
    class oreoIceCream{
      constructor() {
        console.log('oreo')
      }
    };
    
    
    class IceCreamFactory {
      constructor(type) {
        this.type = type
      }
      
      createIceCream = () => {
        
        if(this.type === "vanilla")
          return new vanillaIceCream();
    
        if(this.type === "chocolate")
          return new chocolateIceCream();
    
        if(this.type === "oreo")
          return new oreoIceCream();
      }
    };
    
    const iceCreamFac = new IceCreamFactory('chocolate');
    const iceCream = iceCreamFac.createIceCream();

     

এসো নিজে করি
  • const FullTime = () => {
        this.hourly = "$12";
    };
    
    const PartTime = () => {
        this.hourly = "$11";
    };
    
    const Temporary = () => {
        this.hourly = "$10";
    };
    
    const Contractor =  () => {
        this.hourly = "$15";
    };
    
    function run() {
    
        let employees = [];
        var factory = new Factory();
    
        employees.push(new Contractor());
        employees.push(new Temporary());
        employees.push(new PartTime());
    
        }
    }

    উপরোক্ত কোডটি ফ্যাক্টরি প্যাটার্ণ ফলো করছে কি? না হলে ফ্যাক্টরি প্যাটার্ন এ কোডটিকে রূপান্তরিত কর।

  • ফ্যাক্টরি প্যাটার্ণ abstraction অর্জন করতে সহায়তা করে কিভাবে?
  • কোন কোন ক্ষেত্রে factory pattern ব্যবহার করা যেতে পারে?
  • ফ্যাক্টরি প্যাটার্ণ অব্জেক্ট ক্রিয়েশন কীভাবে ডায়নামিক করে?