"হাই, অ্যামিগো!"

"হাই, বিলাবো!"

"আমাদের আজকের বিষয় নিছক আকর্ষণীয় হবে না - এটি সরাসরি মহাকাব্য হবে।"

"আজ আমি আপনার কাছে যাচ্ছি ডিজাইন প্যাটার্ন কি। "

"কুল! আমি তাদের সম্পর্কে অনেক শুনেছি। আমি অপেক্ষা করতে পারি না!"

"অভিজ্ঞ প্রোগ্রামারদের অনেক ক্লাস লিখতে হয়। কিন্তু এই কাজের সবচেয়ে কঠিন অংশ হল সিদ্ধান্ত নেওয়া যে কোন ক্লাস তৈরি করতে হবে এবং কিভাবে কাজটি তাদের মধ্যে ভাগ করতে হবে।"

"তারা এই জাতীয় প্রশ্নগুলি যত বেশি সমাধান করেছে, তত বেশি তারা বুঝতে পেরেছে যে কিছু সমাধান ভাল, অন্যগুলি খারাপ।"

"খারাপ সমাধানগুলি সাধারণত সমাধানের চেয়ে বেশি সমস্যা তৈরি করে। তারা খারাপভাবে প্রসারিত করে, অনেক অপ্রয়োজনীয় সীমাবদ্ধতা তৈরি করে, ইত্যাদি। এবং ভাল সমাধানগুলি বিপরীত।"

"এমন কিছু সাদৃশ্য আছে যা আপনি করতে পারেন?"

"আসুন আপনি একটি বাড়ি তৈরি করছেন। এবং আপনি এটি কী দিয়ে তৈরি হবে তা নিয়ে ভাবছেন। আপনি সিদ্ধান্ত নিন আপনার দেয়াল, একটি মেঝে এবং একটি ছাদ প্রয়োজন। ফলস্বরূপ, আপনি একটি সমতল ছাদ সহ একটি বাড়ি তৈরি করেন এবং কোনটি নেই। ভিত্তি। এই ধরনের ঘর ফাটবে, এবং ছাদ ফুটো হয়ে যাবে। এটি একটি খারাপ সমাধান।"

"বিপরীতভাবে, একটি ফাউন্ডেশন, দেয়াল এবং একটি গেবল ছাদ সমন্বিত একটি বাড়ি একটি ভাল সমাধান হবে। ভারী তুষারপাত কোন সমস্যা উপস্থাপন করে না, যেহেতু তুষার ছাদ থেকে পিছলে যাবে। এবং মাটি স্থানান্তরের ভয়ের কিছু নেই, কারণ ভিত্তি নিশ্চিত করবে স্থিতিশীলতা। আমরা এই ধরনের সমাধানকে ভালো বলব।"

"আমি দেখছি। ধন্যবাদ।"

"ঠিক আছে। তারপর আমি চালিয়ে যাব।"

"সময়ের সাথে সাথে, ভাল সমাধানগুলি ডিজাইন প্যাটার্ন হিসাবে পরিচিত হয়, যখন খারাপগুলিকে অ্যান্টি-প্যাটার্ন বলা হয়।"

"একটি নকশার প্যাটার্ন হল একটি প্রশ্নের উত্তরের মত। আপনি যদি প্রশ্নটি কখনও শুনেননি তবে এটি বোঝা কঠিন।"

" প্রথম শ্রেণীর নিদর্শন হল সৃজনশীল নিদর্শন। এই ধরনের নিদর্শনগুলি বস্তুর সৃষ্টির সাথে সম্পর্কিত ভাল সমাধান বর্ণনা করে।"

"বস্তু তৈরি করা এত জটিল কি?"

"যেমন এটি ঘটে, আমরা এখন অন্বেষণ করতে যাচ্ছি ঠিক তাই।"

সিঙ্গেলটন প্যাটার্ন।

ডিজাইন প্যাটার্ন: সিঙ্গেলটন, ফ্যাক্টরি, ফ্যাক্টরি মেথড, অ্যাবস্ট্রাক্ট ফ্যাক্টরি- 1

"প্রায়শই প্রোগ্রামে, কিছু বস্তুর শুধুমাত্র একটি কপি থাকতে পারে। উদাহরণস্বরূপ, কনসোল, লগার, আবর্জনা সংগ্রহকারী, ইত্যাদি।"

" খারাপ সমাধান: কোনো অবজেক্ট তৈরি করবেন না - শুধু একটি ক্লাস তৈরি করুন যার পদ্ধতিগুলি সব স্ট্যাটিক।"

" ভাল সমাধান:  একটি একক অবজেক্ট তৈরি করুন এবং এটি একটি স্ট্যাটিক ভেরিয়েবলে সংরক্ষণ করুন। ক্লাসের দ্বিতীয় অবজেক্ট তৈরিতে বাধা দিন। উদাহরণস্বরূপ:"

উদাহরণ
class Sun
{
 private static Sun instance;
 public static Sun getInstance()
 {
  if (instance == null)
  instance = new Sun();

  return instance;
 }

 private Sun()
 {
 }
}
এটা কিভাবে বলা হয়
Sun sun = Sun.getInstance();

"ইহা সহজ."

"প্রথম, আমরা কনস্ট্রাক্টরকে ব্যক্তিগত করে দেই। এখন এটি শুধুমাত্র আমাদের ক্লাসের ভিতর থেকে কল করা যেতে পারে। আমরা সান ক্লাসের পদ্ধতি ব্যতীত সর্বত্র সান অবজেক্টের সৃষ্টি ব্লক করেছি।"

"দ্বিতীয়, এই ক্লাসের একটি অবজেক্ট শুধুমাত্র getInstance() মেথড কল করলেই পাওয়া যাবে। শুধুমাত্র এটিই একমাত্র পদ্ধতি যা একটি সান অবজেক্ট তৈরি করতে পারে, এটি নিশ্চিত করে যে এই ধরনের একটি মাত্র অবজেক্ট আছে।"

"আমি দেখি."

"আপনি যখন মনে করেন, "এখন, আমি কীভাবে এটি করব?", একটি প্যাটার্ন বলে, "আপনি এটি চেষ্টা করতে পারেন - এটি সেরা সমাধানগুলির মধ্যে একটি।""

"ধন্যবাদ। এখন বিষয়গুলো পরিষ্কার হতে শুরু করেছে।"

"আপনি এখানে এই প্যাটার্ন সম্পর্কেও পড়তে পারেন  ।"

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

ডিজাইন প্যাটার্ন: সিঙ্গলটন, ফ্যাক্টরি, ফ্যাক্টরি মেথড, অ্যাবস্ট্রাক্ট ফ্যাক্টরি - 2

"এখানে এমন একটি পরিস্থিতি যা প্রোগ্রামাররা প্রায়শই সম্মুখীন হয়। আপনার কিছু বেস ক্লাস এবং অনেকগুলি সাবক্লাস রয়েছে। উদাহরণস্বরূপ, একটি গেম ক্যারেক্টার ক্লাস (গেমপারসন) এবং অন্যান্য সমস্ত চরিত্রের জন্য ক্লাস যা এটি উত্তরাধিকারসূত্রে পেয়েছে।"

"আসুন বলি আপনার নিম্নলিখিত ক্লাস আছে:"

উদাহরণ
abstract class GamePerson
{
}

class Warrior extends GamePerson
{
}

class Mag extends GamePerson
{
}

class Troll extends GamePerson
{
}

class Elf extends GamePerson
{
}

"প্রশ্ন হল কিভাবে আমরা নমনীয়ভাবে এবং সুবিধাজনকভাবে এই শ্রেণীর বস্তুর সৃষ্টি পরিচালনা করি।"

"যদি এই সমস্যাটি আপনার কাছে দূরবর্তী বলে মনে হয়, তাহলে কল্পনা করুন যে গেমটিতে আপনাকে কয়েক ডজন তলোয়ার এবং ঢাল, শত শত জাদু মন্ত্র এবং হাজার হাজার দানব তৈরি করতে হবে৷ আপনি এখানে বস্তু তৈরির জন্য একটি সুবিধাজনক পদ্ধতি ছাড়া করতে পারবেন না৷ "

" ফ্যাক্টরি প্যাটার্ন একটি ভাল সমাধান প্রস্তাব করে।"

"প্রথমে, আমাদের একটি enum তৈরি করতে হবে যার মান বিভিন্ন শ্রেণীর সাথে মিলে যায়।"

"দ্বিতীয়, একটি বিশেষ ফ্যাক্টরি ক্লাস তৈরি করুন যাতে স্ট্যাটিক পদ্ধতি(গুলি) থাকে যা একটি enum মানের উপর ভিত্তি করে বস্তু(গুলি) তৈরি করে।"

"উদাহরণ স্বরূপ:"

উদাহরণ
public enum PersonType
{
 UNKNOWN,
 WARRIOR,
 MAG,
 TROLL,
 ELF,
}

public class PersonFactory
{
 public static GamePerson createPerson(PersonType personType)
 {
  switch(personType)
  {
   WARRIOR:
   return new Warrior();
   MAG:
   return new Mag();
   TROLL:
   return new Troll();
   ELF:
   return new Elf();
   default:
   throw new GameException();
  }
 }
}
এটা কিভাবে বলা হয়
GamePerson person = PersonFactory.createPerson(PersonType.MAG);

"অন্য কথায়, আমরা অবজেক্ট সৃষ্টি পরিচালনা করার জন্য একটি বিশেষ ক্লাস তৈরি করেছি?"

"হ্যাঁ।"

"তাহলে এটি কি সুবিধা প্রদান করে?"

"প্রথম, এই ক্লাসে, অবজেক্টগুলিকে প্রয়োজনীয় ডেটা দিয়ে শুরু করা যেতে পারে।"

"দ্বিতীয়, শেষ পর্যন্ত পছন্দসই বস্তু তৈরি করার জন্য আপনি যতটা চান পদ্ধতির মধ্যে প্রয়োজনীয় এনাম মান পাস করতে পারেন।"

"তৃতীয়, enum ক্ষেত্রের সংখ্যা ক্লাসের সংখ্যার সাথে মেলে না। অনেক ধরনের অক্ষর থাকতে পারে, কিন্তু কয়েকটি ক্লাস।"

"উদাহরণস্বরূপ, একটি ম্যাগ এবং ওয়ারিয়র একটি শ্রেণী (মানব) ব্যবহার করতে পারে, কিন্তু বিভিন্ন শক্তি এবং জাদু বৈশিষ্ট্য (কন্সট্রাক্টর আর্গুমেন্ট) সহ।"

"এটি দেখতে কেমন হতে পারে তা এখানে (স্বচ্ছতার জন্য, আমি অন্ধকার এলভসও যোগ করেছি):"

উদাহরণ
public enum PersonType
{
 UNKNOWN,
 WARRIOR,
 MAG,
 TROLL,
 ELF,
 DARK_ELF
}

public class PersonFactory
{
 public static GamePerson createPerson(PersonType personType)
 {
  switch(personType)
  {
   WARRIOR:
   return new Human(10, 0); // Strength, magic
   MAG:
   return new Human(0, 10); // Strength, magic
   TROLL:
   OGR:
   return new Troll();
   ELF:
   return new Elf(true); // true – good, false – evil
   DARK_ELF:
   return new Elf(false); // true – good, false – evil
   default:
   throw new GameException();
  }
 }
}
এটা কিভাবে বলা হয়
GamePerson person = PersonFactory.createPerson(PersonType.MAG);

"উপরের উদাহরণে, আমরা ছয়টি ভিন্ন ধরনের অবজেক্ট তৈরি করতে মাত্র তিনটি ক্লাস ব্যবহার করেছি। এটি খুবই সুবিধাজনক। তাছাড়া, আমাদের এই সমস্ত যুক্তি একটি ক্লাস এবং একটি পদ্ধতিতে কেন্দ্রীভূত আছে।"

"এখন ধরুন আমরা Ogre-এর জন্য একটি পৃথক ক্লাস তৈরি করার সিদ্ধান্ত নিয়েছি - আমরা এখানে কোডের কয়েকটি লাইন পরিবর্তন করি, অর্ধেক অ্যাপ্লিকেশন নয়।"

"আমি রাজি। এটা একটা ভালো সমাধান।"

"এবং আমি যা বলছি তা হল: ডিজাইন প্যাটার্ন হল ভাল সমাধানের সংগ্রহ।"

"আমিও চাই যে আমি জানতাম কোথায় সেগুলি ব্যবহার করতে হবে..."

"হ্যাঁ। আমি একমত, আপনি এখনই বুঝতে পারবেন না। তবুও, না জানা এবং না করার চেয়ে না জানা এবং করতে না পারা ভাল। এই প্যাটার্ন সম্পর্কে আপনার জন্য এখানে আরেকটি দরকারী লিঙ্ক: ফ্যাক্টরি প্যাটার্ন "

"ধন্যবাদ."

" বিমূর্ত কারখানা প্যাটার্ন।"

"কখনও কখনও যখন আপনার কাছে প্রচুর বস্তু থাকে, তখন কারখানার জন্য একটি কারখানা তৈরি করার ধারণাটি নিজেই প্রস্তাব করে। এই ধরনের কারখানাকে একটি বিমূর্ত কারখানা বলা হয় ।"

"এটা কোথায় লাগবে?!"

"ধরুন আপনার কাছে অভিন্ন বস্তুর বেশ কয়েকটি গ্রুপ রয়েছে। এটি একটি উদাহরণ দিয়ে দেখানো সহজ।"

"এখন, ধরা যাক আপনার খেলায় তিনটি রেস আছে: মানুষ, এলভস এবং দানব। এবং ভারসাম্যের জন্য, প্রতিটি জাতিতে যোদ্ধা, তীরন্দাজ এবং জাদুকর রয়েছে। একজন খেলোয়াড় শুধুমাত্র সেই রেসের সাথে সম্পর্কিত বস্তু তৈরি করতে পারে যার জন্য সে খেলছে। গেমটিতে। কোডে এটি কেমন দেখাবে তা এখানে:"

সৈনিক শ্রেণীর ঘোষণা
class Warrior
{
}
class Archer
{
}
class Mag
{
}
মানুষ
class HumanWarrior extends Warrior
{
}

class HumanArcher extends Archer
{
}

class HumanMag extends Mag
{
}
এলভস
class ElfWarrior extends Warrior
{
}

class ElfArcher extends Archer
{
}

class ElfMag extends Mag
{
}
রাক্ষস
class DaemonWarrior extends Warrior
{
}

class DaemonArcher extends Archer
{
}

class DaemonMag extends Mag
{
}

এবং এখন এর ঘোড়দৌড় তৈরি করা যাক, অথবা আমরা তাদের সেনাবাহিনীও কল করতে পারি।

সেনাবাহিনী
abstract class Army
{
 public Warrior createWarrior();
 public Archer createArcher();
 public Mag createMag();
}
মানব বাহিনী
class HumanArmy extends Army
{
 public Warrior createWarrior()
 {
  return new HumanWarrior();
 }
 public Archer createArcher()
 {
  return new HumanArcher();
 }
 public Mag createMag()
 {
  return new HumanMag();
 }
}
এলফ বাহিনী
class ElfArmy extends Army
{
 public Warrior createWarrior()
 {
  return new ElfWarrior();
 }
 public Archer createArcher()
 {
  return new ElfArcher();
 }
 public Mag createMag()
 {
  return new ElfMag();
 }
}
দানব বাহিনী
class DaemonArmy extends Army
{
 public Warrior createWarrior()
 {
  return new DaemonWarrior();
 }
 public Archer createArcher()
 {
  return new DaemonArcher();
 }
 public Mag createMag()
 {
  return new DaemonMag();
 }
}

"কিন্তু আপনি এটা কিভাবে ব্যবহার করবেন?"

"আপনি প্রোগ্রামের যেকোন জায়গায় সেনাবাহিনী, ওয়ারিয়র, আর্চার এবং ম্যাজ ক্লাস ব্যবহার করতে পারেন এবং প্রয়োজনীয় বস্তু তৈরি করতে পারেন - কেবলমাত্র কাঙ্ক্ষিত আর্মি সাবক্লাসের একটি অবজেক্ট পাস করুন।"

"উদাহরণ স্বরূপ:"

উদাহরণ
Army humans = new HumanArmy();
Army daemons = new DaemonArmy();

Army winner = FightSimulator.simulate(humans, daemons);

"উপরের উদাহরণে, আমাদের একটি শ্রেণী রয়েছে যা বিভিন্ন জাতি (সেনাবাহিনীর) মধ্যে যুদ্ধ অনুকরণ করে। আপনাকে কেবল দুটি সেনা বস্তু পাস করতে হবে। শ্রেণী নিজেই সেগুলি ব্যবহার করে বিভিন্ন সৈন্য তৈরি করে এবং বিজয়ীকে সনাক্ত করার জন্য তাদের মধ্যে ভার্চুয়াল যুদ্ধ পরিচালনা করে। "

"আমি দেখছি। ধন্যবাদ। সত্যিই একটি আকর্ষণীয় পদ্ধতি।"

"আপনি যাই বলুন না কেন, একটি ভাল সমাধান।"

"হ্যাঁ।"

"এখানে এই বিষয়ে আরেকটি ভাল লিঙ্ক আছে:  বিমূর্ত কারখানা প্যাটার্ন "