ক্লাস থাকা এবং পৃথকভাবে তাদের কল করার চেয়ে কেন কারখানার পদ্ধতি ডিজাইনের প্যাটার্নটি বেশি কার্যকর?


32

"গ্যাং অফ ফোর" ডিজাইনের নিদর্শনগুলি থেকে এখানে কারখানার পদ্ধতি রয়েছে:

class Factory(product)
  case product
  when a
    new A
  when b
    new B
  when c
    new C
end

new Factory(a)

কেন এই তিনটি শ্রেণীতে থাকার চেয়ে বেশি উপকারী a, bএবং cতাদের পৃথকভাবে আহ্বান?


1
আপনি অবিকল কি বলতে চান? তিনটি কেন তাত্ক্ষণিকভাবে চলবে না? তুমি কি এটাই বুজাতে চাও?
নীল

1
@ নীল নো, কারখানার আদলে সমস্ত ক্লাস ভাইবোন হিসাবে বিদ্যমান। কেন কারখানাকে পরোক্ষভাবে এ, বি, সি ক্লাস অ্যাক্সেস করতে কল করুন?
alt

3
এটি আসলে আমার কাছে কারখানার পদ্ধতি প্যাটার্নের মতো লাগে না, যদি এর বিমূর্ত কারখানার কাছাকাছি কিছু থাকে
জে কে।

2
কারণ ডিজাইনের সময় আপনি জানেন না যে 3 টি শ্রেণীর মধ্যে কোনটি ইনস্ট্যান্ট করতে হবে।
মিঃ হোয়াইট

উত্তর:


54

কারণ আপনার উদাহরণটি যথেষ্ট জটিল নয়। এ জাতীয় সাধারণ দৃশ্যের জন্য এটি একটি উন্নত প্যাটার্নটি ব্যবহার করা এমনকি বুদ্ধিমান করে না।

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

হতে পারে objects অবজেক্টগুলিকে কিছু অবজেক্ট এক্সের রেফারেন্সের প্রয়োজন হবে যা কারখানাটি সরবরাহ করতে পারে তবে আপনি যে জায়গাতে এ, বি বা সি তৈরি করতে চান সেখানে আপনার কোড এক্সের অ্যাক্সেস থাকতে পারে না বা থাকতে পারে না Maybe সম্ভবত আপনার যখন এক্স থাকে আপনি এ এবং বি তৈরি করেন তবে আপনার ওয়াই টাইপ থাকলে আপনি সি তৈরি করেন

এছাড়াও বিবেচনা করুন যে কিছু বস্তুর তৈরিতে 20 নির্ভরতা প্রয়োজন হতে পারে; তখন কি? সেই জায়গাগুলির সেই নির্ভরতাগুলির জন্য অনুসন্ধান করতে গিয়ে যেখানে তাদের অ্যাক্সেসযোগ্য হবে না এমন সমস্যা হতে পারে।


13
এটি পরিষ্কার করার জন্য +1 যে কারখানার প্যাটার্নটি সর্বদা সেরা পদ্ধতির নয়।
নীল

1
কারণ আপনার উদাহরণটি যথেষ্ট জটিল নয়। এ জাতীয় সাধারণ দৃশ্যের জন্য এটি একটি উন্নত প্যাটার্নটি ব্যবহার করা এমনকি বুদ্ধিমান করে না। তাহলে আপনি এই ক্ষেত্রে কি করবেন? শর্তাধীন নির্মাণের ইনলাইন?
pdr

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

প্যাটার্নটিকে একটি কারণ হিসাবে কারখানা পদ্ধতি বলা হয়। কারখানার পদ্ধতি হওয়ার জন্য পদ্ধতিটি আলাদা শ্রেণিতে থাকতে হবে না (যদিও এটি প্রায়শই হয়)।
পিডিআর

আমি এতে "পদ্ধতি" মিস করেছি, তাই আপনি ঠিক মশাই।
ম্যাটিউজ

23

একটি কারখানার প্যাটার্ন সাধারণত তার চেয়ে জটিল। কোন ফ্যাক্টরি নির্দিষ্ট মানদণ্ডে সিদ্ধান্ত নেয় যে কোন উদাহরণটি তৈরি / প্রত্যাবর্তন করবে। পরিবর্তে, আপনি যখন কারখানাটি ব্যবহার করবেন না, তখন আপনার কোডটি বার বার আপনার কোডের বিভিন্ন স্থানে ব্যবহৃত হত।

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


20

কারখানার পদ্ধতি প্যাটার্ন কলিং ক্লাস থেকে সিদ্ধান্ত গ্রহণের প্রক্রিয়া বাদ দেয়। এর বিভিন্ন সুবিধা রয়েছে:

পুনরায় ব্যবহার করে। আমি যদি অনেক জায়গায় ইনস্ট্যান্ট করতে চাই, আমার শর্তটি পুনরায় করতে হবে না, তাই যখন আমি একটি নতুন ক্লাস যুক্ত করতে আসি, তখন আমি একটি হারিয়ে যাওয়ার ঝুঁকি চালাই না।

ইউনিট-Testability। আমি কারখানার জন্য 3 টি পরীক্ষা লিখতে পারি, এটি সঠিক অবস্থার উপর সঠিক ধরণের প্রত্যাশা করে তা নিশ্চিত করার জন্য, তবে আমার কলিং ক্লাসটি কেবলমাত্র এটি পরীক্ষা করতে হবে এটি কারখানায় কল দেয় কিনা এবং তারপরে ফিরে আসা শ্রেণীর প্রয়োজনীয় পদ্ধতিগুলি। কারখানার নিজে বা কংক্রিটের ক্লাসগুলির বাস্তবায়ন সম্পর্কে এটি কিছু জানতে হবে না।

Extensibility। যখন কেউ সিদ্ধান্ত নেয় যে এই কারখানায় আমাদের একটি নতুন ক্লাস ডি যুক্ত করা দরকার, কলিং কোডের কোনওটিই নয়, ইউনিট টেস্ট বা বাস্তবায়নও কখনই বলা দরকার। আমরা কেবল একটি নতুন ক্লাস ডি তৈরি করি এবং আমাদের কারখানা পদ্ধতিটি প্রসারিত করি। এটি ওপেন-ক্লোজড নীতিমালার খুব সংজ্ঞা ।

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

যেমন বলা হয়েছে, কারখানা প্যাটার্ন সবসময় যাওয়ার উপায় নয়। তবে, আপনি যেখানে শর্তসাপেক্ষ তাত্ক্ষণিকতা দেখেন না কেন আপনার এটি একটি মুহুর্তের চিন্তাভাবনা করা উচিত।


14

কারখানার প্যাটার্নটির মূল সুবিধাগুলি হ'ল দ্বিগুণ:

  1. যে জায়গাগুলিতে পণ্যটির বাস্তবায়ন প্রয়োজন সেগুলি কীভাবে তৈরি করতে হয় তা জানতে হবে না। কারখানাটি সেই তথ্য ধারণ করে।

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

  2. যে জায়গাগুলিতে পণ্যটির বাস্তবায়ন প্রয়োজন সেগুলি মডিউল বর্ণনার সময় (যেমন সংকলনের সময়) বাস্তবায়ন শ্রেণীর নাম কী তা জানতে হবে না।

    সুতরাং, aকিছু করার দরকার নেই A; "কী তৈরি করবেন" কেবলমাত্র নাম নয়, কাঙ্ক্ষিত অ-কার্যকরী বৈশিষ্ট্যের ক্ষেত্রে বর্ণনা করা যেতে পারে। এটি অনেক বেশি নমনীয়।

খারাপ দিকটি হ'ল যেখানে আপনি কীভাবে বানাবেন এবং কীভাবে করবেন তা জানেন, আপনি যখন কারখানা ব্যবহার করেন আপনি আরও জটিলতা পান। যদিও এটির ফিক্সটি সহজ: যখন কোনও কারখানাটি বোধগম্য হয় না তখন তা ব্যবহার করবেন না!


2

আমি শ্রেণিগুলিকে 'মানুষ' হিসাবে বিবেচনা করে নকশার নিদর্শনগুলি সম্পর্কে ভাবতে চাই এবং নিদর্শনগুলি এমন এক উপায় যা লোক একে অপরের সাথে কথা বলে।

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

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

একইভাবে, একটি ফ্যাক্টরি ব্যবহার করে গ্রাহকরা কীভাবে তাদের তৈরি করা হয় বা তাদের নির্ভরতা কী তা বিশদ না জেনে নতুন সামগ্রী তৈরি করতে সক্ষম করে - তাদের কেবলমাত্র তারা যা চায় সে তথ্য দিতে হবে।

শ্লীলতা


1

কারখানার প্যাটার্নটি সর্বাধিক ব্যবহৃত এবং অপব্যবহার করা ডিজাইনের ধরণ।

আমি এমন অনেকগুলি মামলা জুড়ে এসেছি যেখানে একটি ফ্যাক্টরি শ্রেণি কোড করা হয় যখন একটি সাধারণ নির্মাণকারী পর্যাপ্ত হবে।

কারখানার ক্লাস ব্যবহার করবেন না যদি না: -

  • আপনি একটি বাহ্যিক উত্স উপর নির্ভর করে কিন্তু আপনি ঠিক কোনটি এখনও জানেন না।
  • নির্মাণ ব্যয়বহুল এবং আপনি একবার তৈরি করতে এবং বহুবার পুনরায় ব্যবহার করতে চান।
  • একটি নতুন উদাহরণ তৈরি করা নির্ভর করে ইতিমধ্যে কোন দৃষ্টান্ত তৈরি করা হয়েছে তার উপর নির্ভর করে (যেমন আপনার কেবল পাঁচটি সংযোগ থাকতে পারে, বা আপনার শেষ সংখ্যার চেয়ে আরও একটি সংযোগ আইডি নম্বর ব্যবহার করা উচিত)।

0

সাবক্লাস ইনস্ট্যান্ট করার সময় কারখানা পদ্ধতিটি ব্যবহার করুন এবং কোন নির্দিষ্ট সাবক্লাসটি তাত্ক্ষণিকভাবে স্থিত হয়েছে তা সিদ্ধান্ত নেওয়ার জন্য ক্লায়েন্ট কোডকে দায়বদ্ধ বলে মনে করা হচ্ছে না।

এটি দরকারী কারণ এটি যখন ক্লাসটি তাত্ক্ষণিকভাবে পরিবর্তিত হয় তখন আপনাকে ক্লায়েন্ট কোড পরিবর্তন করতে বাধা দেয়। বিদ্যমান কোড পরিবর্তন করা খারাপ অভ্যাস কারণ এটি সাধারণত ত্রুটিযুক্ত প্রবণ।

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

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.