এই শেফফ্যাক্টরি শর্তসাপূর্ণ বিবৃতিগুলি কী কী অবজেক্টটি ইনস্ট্যান্ট করতে হবে তা নির্ধারণ করতে ব্যবহার করে। আমরা কি ভবিষ্যতে অন্যান্য ক্লাস যুক্ত করতে চাইলে আমাদের শেপফ্যাক্টরি সংশোধন করতে হবে না? কেন এটি খোলা বন্ধ নীতি লঙ্ঘন করে না?
এই শেফফ্যাক্টরি শর্তসাপূর্ণ বিবৃতিগুলি কী কী অবজেক্টটি ইনস্ট্যান্ট করতে হবে তা নির্ধারণ করতে ব্যবহার করে। আমরা কি ভবিষ্যতে অন্যান্য ক্লাস যুক্ত করতে চাইলে আমাদের শেপফ্যাক্টরি সংশোধন করতে হবে না? কেন এটি খোলা বন্ধ নীতি লঙ্ঘন করে না?
উত্তর:
প্রচলিত অবজেক্ট-ভিত্তিক জ্ঞান হ'ল if
বিবৃতি এড়ানো এবং একটি বিমূর্ত শ্রেণীর সাবক্লাসে ওভাররাইড পদ্ধতিগুলির গতিশীল প্রেরণের মাধ্যমে তাদের প্রতিস্থাপন করা। এ পর্যন্ত সব ঠিকই.
কারখানার প্যাটার্নটির মূল বিষয় হ'ল পৃথক সাবক্লাস সম্পর্কে জানার থেকে আপনাকে মুক্তি দেওয়া এবং কেবল বিমূর্ত সুপারক্লাসের সাথে কাজ করা । ধারণাটি হ'ল কারখানাটি কোন নির্দিষ্ট ক্লাসটি ইনস্ট্যান্ট করতে হবে তার চেয়ে ভাল আপনার জানা আছে এবং কেবল সুপার ক্লাস দ্বারা প্রকাশিত পদ্ধতিগুলির সাথে আপনি কাজ করা ভাল। এটি প্রায়শই সত্য এবং একটি মূল্যবান নিদর্শন।
অতএব, কোনও কারখানা নেই যে কোনও কারখানার শ্রেণি লিখলে if
বিবৃতি অগ্রাহ্য করতে পারে । এটি কলারের কাছে একটি নির্দিষ্ট শ্রেণি বাছাই করার বোঝাটি সরিয়ে ফেলবে, যা প্যাটার্নটি এড়াতে হবে ঠিক তাই। সমস্ত নীতিই নিখুঁত নয় (বাস্তবে কোনও নীতিই নিখুঁত নয়) এবং আপনি যদি এই প্যাটার্নটি ব্যবহার করেন তবে আপনি ধরে নিতে পারেন যে এটির সুবিধাটি ব্যবহার না করার সুবিধার চেয়ে বেশি if
।
if
এস ছাড়াই কারখানার প্যাটার্ন তৈরি করা পুরোপুরি সম্ভব । এটি কীভাবে অর্জন করা যায় তার একটি সহজ উদাহরণের জন্য @ বি এর উত্তর দেখুন। Downvoted।
উদাহরণটি সম্ভবত শর্তযুক্ত বিবৃতি ব্যবহার করে কারণ এটি সবচেয়ে সহজ। আরও জটিল বাস্তবায়ন মানচিত্র বা কনফিগারেশন বা (যদি আপনি সত্যিই অভিনব হতে চান) এমন এক ধরণের রেজিস্ট্রি ব্যবহার করতে পারেন যেখানে ক্লাসগুলি নিজেরাই নিবন্ধন করতে পারে। তবে শর্তসাপেক্ষে ক্লাসের সংখ্যা কম থাকলে এবং খুব কম সময়ে পরিবর্তিত হওয়ার ক্ষেত্রে কোনও দোষ নেই।
ভবিষ্যতে নতুন সাবক্লাসের জন্য সমর্থন যুক্ত করার শর্তসাপেক্ষ প্রসারিত করা প্রকৃতপক্ষে কঠোরভাবে বলতে হবে খোলা / বদ্ধ নীতি লঙ্ঘন। "সঠিক" সমাধানটি হ'ল একই ইন্টারফেস সহ একটি নতুন কারখানা তৈরি করা। এতে বলা হয়েছে, ও / সি নীতিমালার অনুসরণ সর্বদা কেআইএসএস এবং ইয়াজিএনআইয়ের মতো অন্যান্য ডিজাইনের নীতিগুলির বিরুদ্ধে হওয়া উচিত।
এটি বলেছিল, প্রদর্শিত কোডটি স্পষ্টভাবে উদাহরণ কোড যা কোনও কারখানার ধারণা প্রদর্শন করার জন্য ডিজাইন করা হয়েছে এবং অন্য কিছুই নয়। উদাহরণস্বরূপ যেমন নাল ফিরে ফেলা সত্যই এটি খারাপ স্টাইল, তবে আরও বিস্তৃত ত্রুটি পরিচালনার বিষয়টি বিন্দুটিকে অস্পষ্ট করবে। উদাহরণ কোডটি উত্পাদন মানের কোড নয়, আপনার এটির আশা করা উচিত নয়।
প্যাটার্নটি নিজেই ওপেন / ক্লোজড নীতি (ওসিপি) লঙ্ঘন করে না। তবে, আমরা যখন প্যাটার্নটি ভুলভাবে ব্যবহার করি তখন আমরা ওসিপি লঙ্ঘন করি।
এই প্রশ্নের সহজ উত্তর নিম্নরূপ:
প্রদত্ত উদাহরণে আপনার বেস কার্যকারিতা তিনটি আকারকে সমর্থন করে: বৃত্ত, আয়তক্ষেত্র এবং স্কোয়ার। মনে করুন ভবিষ্যতে আপনার ট্রায়াঙ্গেল, পেন্টাগন এবং হেক্সাগনকে সমর্থন করতে হবে। এই কাজের জন্য ছাড়া OCP লঙ্ঘন, আপনি একটি অতিরিক্ত কারখানা আপনার নতুন আকার (আসুন নামক সমর্থন করার জন্য তৈরি করতে হবে AdvancedShapeFactory
) এবং তারপর ব্যবহার AbstractFactory সিদ্ধান্ত নিতে কি কারখানা আপনি তৈরি করতে যাই হোক না কেন আপনি প্রয়োজন আকার তৈরি করতে হবে।
আপনি যদি অ্যাবস্ট্রাক্ট ফ্যাক্টরি প্যাটার্ন সম্পর্কে কথা বলছেন, সিদ্ধান্তটি প্রায়শই কারখানায় থাকে না তবে অ্যাপ্লিকেশন কোডে থাকে। এটি সেই কোড যা কোন কংক্রিট কারখানাটি ইনস্ট্যান্ট করতে এবং ক্লায়েন্ট কোডটি পাস করার জন্য চয়ন করে যা কারখানার দ্বারা উত্পাদিত অবজেক্টগুলিকে ব্যবহার করবে। জাভা উদাহরণের শেষটি এখানে দেখুন: https://en.wikedia.org/wiki/Abstract_factory_pattern
সিদ্ধান্ত গ্রহণ অগত্যা if
বিবৃতি বোঝায় না । এটি একটি কনফিগার ফাইল থেকে কংক্রিট কারখানার ধরণ পড়তে পারে, মানচিত্রের কাঠামো থেকে শুরু করে ইত্যাদি could
যদি আপনি এই কারখানার সাথে ক্লাস স্তরে ওপেন-ক্লোজ সম্পর্কে চিন্তা করেন তবে আপনি আপনার সিস্টেমে ওপেন-ক্লোজকে অন্য শ্রেণি তৈরি করছেন, উদাহরণস্বরূপ যদি আপনার কাছে অন্য শ্রেণি থাকে যা একটি আকার নেয় এবং অঞ্চলটি গণনা করে (সাধারণ উদাহরণ) এই শ্রেণিটি ওপেন ক্লোজ কারণ এটি পরিবর্তন ছাড়াই নতুন ধরণের আকারের জন্য অঞ্চলটি গণনা করতে পারে। তারপরে আপনার কাছে আরও একটি শ্রেণি রয়েছে যা আকৃতিটি আঁকায়, অন্য শ্রেণি যা এন আকার নিয়ে এবং আরও বড়টিকে ফিরিয়ে দেয় এবং আপনি সাধারণভাবে ভাবতে পারেন যে আপনার সিস্টেমের অন্যান্য শ্রেণিগুলি যা আকারগুলি নিয়ে কাজ করে সেগুলি ওপেন-ক্লোজ (কমপক্ষে আকারগুলি সম্পর্কে)। ডিজাইনের দিকে নজর রেখে কারখানাটি সিস্টেমটির বাকী অংশগুলি ওপেন-ক্লোজ এবং অফ কোর্সটিতে সক্ষম করে দেয় কারখানাটি নিজেই এটি উন্মুক্ত নয়।
অবশ্যই আপনি এই কারখানাটি ওপেন-ক্লোজ করতে পারেন, কিছু ধরণের গতিশীল লোডিংয়ের মাধ্যমে এবং আপনার পুরো সিস্টেমটি ওপেন-ক্লোজ হতে পারে (উদাহরণস্বরূপ ক্লাসপথে কিছুটা জার ফেলে নতুন আকার যোগ করতে পারেন)। আপনার মূল্যায়ন করতে হবে আপনার অতিরিক্ত যে সিস্টেমটি তৈরি হচ্ছে তার উপর নির্ভর করে এই অতিরিক্ত জটিলতাটি মূল্যবান, সমস্ত সিস্টেমে প্লাগযোগ্য বৈশিষ্ট্য প্রয়োজন না এবং সমস্ত সিস্টেমকে সম্পূর্ণ ওপেন-ক্লোজ হওয়ার দরকার নেই।
লিসকোভ প্রতিস্থাপনের নীতি হিসাবে উন্মুক্ত-নীতিটি উত্তরাধিকারের শ্রেণিবিন্যাসের জন্য শ্রেণিকক্ষের ক্ষেত্রে প্রযোজ্য। আপনার উদাহরণস্বরূপ, কারখানা শ্রেণি এটি ইনস্ট্যান্ট করা ক্লাসগুলির পারিবারিক বৃক্ষে নেই তাই এটি এই নিয়মগুলি লঙ্ঘন করতে পারে না। শেপ বেস শ্রেণিতে যদি আপনার গেটশ্যাপ (বা আরও সঠিকভাবে নামকরণ করা, ক্রিয়েট শেপ) প্রয়োগ করা হয় তবে লঙ্ঘন হবে।
আপনি কীভাবে এটি বাস্তবায়ন করেন এটি নির্ভর করে। আপনি std::map
অবজেক্ট তৈরির জন্য ফাংশন পয়েন্টার ধরে রাখতে ব্যবহার করতে পারেন । তাহলে উন্মুক্ত / ঘনিষ্ঠ নীতি লঙ্ঘন করা হয় না। অথবা স্যুইচ / কেস
যাইহোক, আপনি যদি কারখানার ধরণটি পছন্দ না করেন তবে আপনি সর্বদা নির্ভরতা ইনজেকশন ব্যবহার করতে পারেন।