কনস্ট্রাক্টর বনাম কারখানার পদ্ধতিগুলি [বন্ধ]


180

ক্লাস মডেলিংয়ের সময়, আরম্ভ করার পছন্দের উপায়টি কী:

  1. নির্মাতারা, বা
  2. কারখানার পদ্ধতি

এবং তাদের উভয় ব্যবহার করার জন্য বিবেচনাগুলি কী হবে?

নির্দিষ্ট পরিস্থিতিতে আমি কারখানার পদ্ধতি থাকা পছন্দ করি যা যদি অবজেক্টটি নির্মাণ না করা যায় তবে তা বাতিল হয়ে যায়। এটি কোড ঝরঝরে করে তোলে। কনস্ট্রাক্টর থেকে ব্যতিক্রম ছোঁড়ার বিপরীতে বিকল্প পদক্ষেপ নেওয়ার আগে প্রত্যাবর্তিত মানটি শূন্য হয় না কিনা তা আমি কেবল খতিয়ে দেখতে পারি। (আমি ব্যক্তিগতভাবে ব্যতিক্রম পছন্দ করি না)

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

এর বিপরীতে আমার কাছে সেই ক্লাসগুলির একটি স্থিতিশীল কারখানা পদ্ধতি থাকতে পারে যা রেকর্ড সন্ধান না করা হলে শূন্য ফিরে আসবে।

এক্ষেত্রে কনস্ট্রাক্টর বা কারখানার পদ্ধতিতে কোন পদ্ধতির ভাল?

উত্তর:


66

ডিজাইন প্যাটার্নগুলির পৃষ্ঠা 108 থেকে : গামা, হেলম, জনসন এবং ভ্লিসাইডস দ্বারা পুনঃব্যবহারযোগ্য অবজেক্ট-ওরিয়েন্টড সফ্টওয়্যার এর উপাদানসমূহ।

কারখানার পদ্ধতি প্যাটার্নটি ব্যবহার করুন

  • একটি শ্রেণি অবজেক্টগুলির শ্রেণীর পূর্বে এটি তৈরি করতে পারে তা অনুমান করতে পারে না
  • একটি শ্রেণি চায় তার সাবক্লাসগুলি এটি তৈরি করা অবজেক্টগুলি নির্দিষ্ট করতে
  • ক্লাসগুলি বেশ কয়েকটি সহায়ক সাবক্লাসগুলির মধ্যে একটিতে দায়িত্ব অর্পণ করে এবং আপনি কোন জ্ঞানকে স্থানীয়করণ করতে চান কোন সহায়ক সাবক্লাসটি প্রতিনিধি

21
স্থির কারখানার পদ্ধতিটি GoF ডিজাইনের ধরণ থেকে আলাদা - কারখানার পদ্ধতি প্যাটার্ন। stackoverflow.com/questions/929021/…
শ্রী রামা

দয়া করে GoF ডিজাইনের ধরণগুলির কারখানার পদ্ধতি প্যাটার্নের সাথে তুলনা করবেন না।
শ্রী রামা

137
এটি আমার কিছুই ব্যাখ্যা করে না
সুশান্ত

@ সুশান্ত, এমন কেন?
পলডি

2
এই উত্তরটি প্রশ্নের ধারণাটির উত্তর দেয় না কেবল ধারণাটি বুঝতে / বোঝাতে পড়তে তথ্য সম্পর্কিত করে ... এটি আরও একটি মন্তব্য।
Crt

201

নিজেকে জিজ্ঞাসা করুন তারা কী এবং কেন আমাদের তা আছে। তারা উভয় সেখানে আছে একটি বস্তুর উদাহরণ তৈরি করতে।

ElementarySchool school = new ElementarySchool();
ElementarySchool school = SchoolFactory.Construct(); // new ElementarySchool() inside

এখন পর্যন্ত কোনও পার্থক্য নেই। এখন কল্পনা করুন যে আমাদের বিভিন্ন বিদ্যালয়ের প্রকার রয়েছে এবং আমরা এলিমেন্টারি স্কুল থেকে হাইস্কুলে পরিবর্তন করতে চাই (যা একটি এলিমেন্টারি স্কুল থেকে প্রাপ্ত বা এলিমেন্টারিস্কুলের মতো একই ইন্টারফেস আইএস স্কুল প্রয়োগ করে)। কোড পরিবর্তনটি হ'ল:

HighSchool school = new HighSchool();
HighSchool school = SchoolFactory.Construct(); // new HighSchool() inside

একটি ইন্টারফেস ক্ষেত্রে আমাদের হবে:

ISchool school = new HighSchool();
ISchool school = SchoolFactory.Construct(); // new HighSchool() inside

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

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

ISchool school = SchoolFactory.ConstructForStudent(myStudent);

এখন আপনার অ্যাপ্লিকেশনটিতে আপনার কাছে একটি জায়গা রয়েছে যাতে ব্যবসার যুক্তি রয়েছে যা নির্ধারণ করে যে ISchool বিভিন্ন IStudent অবজেক্টের জন্য ইনস্ট্যান্ট করতে কী পছন্দ করে।

সুতরাং - সাধারণ শ্রেণীর জন্য (মান অবজেক্টস ইত্যাদি) কনস্ট্রাক্টর ঠিকঠাক (আপনি আপনার অ্যাপ্লিকেশনকে বেশি পরিমাণে বিবেচনা করতে চান না) তবে জটিল শ্রেণীর শ্রেণিবিন্যাসের জন্য ফ্যাক্টরি পদ্ধতিটি একটি পছন্দের উপায়।

আপনি চারটি বই "প্রোগ্রাম একটি ইন্টারফেস, একটি বাস্তবায়ন নয়" এর গ্যাং থেকে প্রথম নকশার নীতিটি অনুসরণ করেন ।


2
এমনকি আপনি যখন মনে করেন এটি একটি সাধারণ শ্রেণি, তখনও কারও জন্য আপনার সাধারণ শ্রেণিটি প্রসারিত করার একটি সুযোগ রয়েছে, তাই কারখানার পদ্ধতি এখনও আরও ভাল। উদাহরণস্বরূপ আপনি এলিমেন্টারিস্কুল দিয়ে শুরু করতে পারেন তবে পরে কেউ (নিজেকে সহ) প্রাইভেটএলমেন্টারি স্কুল এবং পাবলিকএলমেন্টারি স্কুল সহ এটি বাড়িয়ে দিতে পারেন।
জ্যাক 14 ই

10
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত
am05mhz

2
@ ডেভিড, ভাল উত্তর, তবে আপনি এমন একটি উদাহরণ দিয়ে প্রসারিত করতে পারেন যেখানে প্রতিটি ইন্টারফেস প্রয়োগের জন্য নির্মাণের জন্য বিভিন্ন পরামিতি প্রয়োজন হতে পারে। এখানে একটি নির্বোধ উদাহরণ: IFood sandwich = new Sandwich(Cheese chz, Meat meat);এবং IFood soup = new Soup(Broth broth, Vegetable veg);কারখানা এবং বা নির্মাতারা কীভাবে এখানে সহায়তা করতে পারে?
ব্রায়ান

1
আমি কেবল কারখানার ব্যবহারের উদ্দেশ্যে অন্য তিনটি ব্যাখ্যা পড়েছি এবং অবশেষে এটি আমার জন্য "ক্লিক" করেছে। ধন্যবাদ!
ড্যানিয়েল পিয়েরানো

কেন এই উত্তর গৃহীত হয় না?
টমাস

74

আপনাকে পড়তে হবে (যদি আপনার অ্যাক্সেস থাকে তবে) কার্যকর জাভা 2 আইটেম 1: কনস্ট্রাক্টরের পরিবর্তে স্থির কারখানার পদ্ধতিগুলি বিবেচনা করুন

স্ট্যাটিক কারখানার পদ্ধতিগুলির সুবিধা:

  1. তাদের নাম আছে।
  2. প্রতিবার যখন তাদের অনুরোধ করা হয় তখন তাদের কোনও নতুন অবজেক্ট তৈরি করার প্রয়োজন হয় না।
  3. তারা তাদের রিটার্নের ধরণের যে কোনও উপ-টাইপের একটি বস্তু ফেরত দিতে পারে।
  4. তারা প্যারামিটারাইজড ধরণের দৃষ্টান্ত তৈরির ভার্বোসিটি হ্রাস করে।

স্থিতিশীল কারখানা পদ্ধতির অসুবিধা:

  1. যখন কেবল স্থিতিশীল কারখানার পদ্ধতি সরবরাহ করা হয়, তখন পাবলিক বা সুরক্ষিত নির্মাতারা ব্যতীত ক্লাসগুলি সাবক্ল্যাস করা যায় না।
  2. তারা অন্যান্য স্থিতিশীল পদ্ধতি থেকে সহজেই পৃথক নয়

4
এটি জাভাতে আমার তীব্র ত্রুটিযুক্ত ত্রুটি বলে মনে হচ্ছে, তারপরে একটি সাধারণ ওওডি সমস্যা। অনেক OO যেমন পণ্য ভাষায় না যে এমনকি না আছে কনস্ট্রাকটর, এখনো subclassing কাজ ঠিক সূক্ষ্ম।
জার্গ ডব্লু মিটাগ

1
@ আচারুভিম কেন বেশিরভাগ কোড কনস্ট্রাক্টর ব্যবহার করে লেখা হয় যদি( factory methods are better than Constructors. ( Item-1 ) ) Effective java
আসিফ মোশতাক

ভাল দিক. এটি জাভা নির্দিষ্ট যদিও। একটি ভাষা বৈশিষ্ট্যের জন্য একটি কেস তৈরি করা যেতে পারে যা কারখানার পদ্ধতিগুলিকে অন্যান্য স্থিতিশীল পদ্ধতি থেকে পৃথক করে তোলে।
ওসিডিভ

30

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

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


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

1
খুব গুরুত্বপূর্ণ বিষয়। ফ্যাক্টরি এবং কনস্ট্রাক্টরদের তুলনা করে এমন একটি গবেষণামূলক গবেষণামূলক ফলাফল অত্যন্ত উল্লেখযোগ্য ফলাফল পেয়েছে যা ইঙ্গিত করে যে কারখানাগুলি এপিআই ব্যবহারের পক্ষে ক্ষতিকর: "ব্যবহারকারীরা কোনও নির্মাণকারীর চেয়ে কারখানায় কোনও বস্তু তৈরি করতে উল্লেখযোগ্যভাবে আরও বেশি সময় (পি = 0.005) প্রয়োজন" [এপিআই ডিজাইনের ফ্যাক্টরি প্যাটার্ন : একটি ব্যবহারযোগ্যতা মূল্যায়ন ]।
এমডিএফ

12

যখন কেবল অবজেক্ট তৈরির সাথে আপনার অতিরিক্ত নিয়ন্ত্রণের প্রয়োজন হয় তখনই একটি কারখানা ব্যবহার করুন যা কনস্ট্রাক্টর দিয়ে করা যায় না।

কারখানাগুলির উদাহরণস্বরূপ ক্যাশে হওয়ার সম্ভাবনা রয়েছে।

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


11

"কার্যকর জাভা", দ্বিতীয় সংস্করণ, আইটেম 1 এর একটি উদ্ধৃতিটি 1: নির্মাণকারীর পরিবর্তে স্থির কারখানার পদ্ধতিগুলি বিবেচনা করুন, পি। 5:

"নোট করুন যে স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি ডিজাইন প্যাটার্নগুলি [গামা 95, পৃষ্ঠা 107] থেকে কারখানার পদ্ধতি প্যাটার্নের সমান নয় this


10

"কার্যকর জাভা" ছাড়াও (অন্য উত্তরে উল্লিখিত হিসাবে), আরও একটি ক্লাসিক বইতেও পরামর্শ দেওয়া হয়েছে:

স্থিতিশীল কারখানার পদ্ধতিগুলি (নামগুলির সাথে যুক্তিগুলি বর্ণনা করে) অতিরিক্ত লোড কনস্ট্রাক্টরগুলিকে পছন্দ করুন।

যেমন। লিখবেন না

Complex complex = new Complex(23.0);

পরিবর্তে লিখুন

Complex complex = Complex.fromRealNumber(23.0);

Complex(float)গ্রাহককে স্থির কারখানার পদ্ধতিতে কল করতে বাধ্য করতে কন্সট্রাক্টরকে ব্যক্তিগত করার পরামর্শ দেওয়া হয়েছে ।


2
বইটির সেই অংশটি পড়ে আমার এখানে এনেছে
বেগুনি ধূসর

1
@ ব্যারেম: আমিও সম্প্রতি এটিকে পুনরায় পড়ছিলাম এবং ভেবেছিলাম আমার উত্তরগুলি যুক্ত করা উচিত।
নীল_নোট

1
একটি সম্পর্কিত নোট অন, আপনি সহায়ক হতে পারে কিছু নামকরণের নিয়মাবলী দ্বারা কাজ java.time ফ্রেমওয়ার্ক এর নামকরণ সংক্রান্ত from…, to…, parse…, with…, ইত্যাদি। মনে রাখবেন জাভা.টাইম ক্লাসগুলি অপরিবর্তনীয় হতে নির্মিত, তবে এর মধ্যে কয়েকটি নামকরণের কনভেনশনগুলি পরিবর্তনীয় ক্লাসগুলি অনুসরণ করতেও কার্যকর হতে পারে।
বেসিল Bourque

7

সিএডি / সিএএম অ্যাপ্লিকেশন থেকে একটি দৃ concrete় উদাহরণ।

একটি নির্মাণকারী ব্যবহার করে একটি কাটিয়া পথ তৈরি করা হবে। এটি একটি ধারাবাহিক রেখা এবং আরাকস যা কাটার পথ নির্ধারণ করে। লাইন এবং আরাক্সের সিরিজগুলি ভিন্ন হতে পারে এবং বিভিন্ন স্থানাঙ্ক থাকতে পারে এটি সহজেই কন্সট্রাক্টরের একটি তালিকা পাস করে পরিচালনা করা হয়।

একটি কারখানা ব্যবহার করে একটি আকার তৈরি করা হবে। কারণ একটি শেপ শ্রেণি থাকাকালীন প্রতিটি আকৃতিটি কী ধরণের আকারের উপর নির্ভর করে সেটআপ করা হবে। আমরা জানি না যে ব্যবহারকারী কোনও নির্বাচন না করা পর্যন্ত আমরা কোন আকারটি শুরু করতে যাচ্ছি।


5

বলুন, আমার ক্লাসে একজন কনস্ট্রাক্টর রয়েছে যা একটি আইডি মান আশা করে। কনস্ট্রাক্টর এই মানটি ব্যবহার করে ডেটাবেস থেকে শ্রেণি তৈরি করে।

এই প্রক্রিয়াটি অবশ্যই কোনও নির্মাণকারীর বাইরে হওয়া উচিত।

  1. কনস্ট্রাক্টরের ডাটাবেস অ্যাক্সেস করা উচিত নয়।

  2. কাজের এবং কন্সট্রাকটর জন্য কারণ হয় ডেটা সদস্যদের আরম্ভ করুন এবং বর্গ পরিবর্তিত স্থাপন কন্সট্রাকটর মধ্যে পাস মান ব্যবহার করে।

  3. অন্য সব কিছুর জন্য আরও ভাল পদ্ধতির হ'ল স্থির কারখানা পদ্ধতি বা আরও জটিল ক্ষেত্রে পৃথক কারখানা বা বিল্ডার শ্রেণি ব্যবহার করা।

মাইক্রোসফ্ট থেকে কিছু কনস্ট্রাক্টর গাইড লাইন :

কনস্ট্রাক্টরে ন্যূনতম কাজ করুন। কনস্ট্রাক্টরগুলির প্যারামিটারগুলি ক্যাপচার করা ছাড়া কনস্ট্রাক্টরের খুব বেশি কাজ করা উচিত নয়। প্রয়োজনীয়তা না হওয়াতে অন্য কোনও প্রক্রিয়াকরণের ব্যয় স্থগিত করা উচিত।

এবং

কাঙ্ক্ষিত ক্রিয়াকলাপের শব্দার্থবিজ্ঞান সরাসরি কোনও নতুন উদাহরণ নির্মাণে ম্যাপ না করে তবে কনস্ট্রাক্টরের পরিবর্তে স্থির কারখানা পদ্ধতিটি বিবেচনা করুন।


2

কখনও কখনও আপনাকে কোনও অবজেক্ট তৈরি করার সময় কিছু মান / শর্তাদি পরীক্ষা করতে / গণনা করতে হয়। এবং যদি এটি একটি ব্যতিক্রম ছুঁড়ে ফেলতে পারে - কনস্ট্রাক্ট্রো খুব খারাপ উপায়। সুতরাং আপনার এই জাতীয় কিছু করা দরকার:

var value = new Instance(1, 2).init()
public function init() {
    try {
        doSome()
    }
    catch (e) {
        soAnotherSome()
    }
}

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

কেউ আপনাকে ক্যাশে দেওয়ার কথা বলেছিল। এটা ভালো. তবে আপনাকে ফ্লাইওয়েট প্যাটার্ন সম্পর্কেও মনে রাখতে হবে যা কারখানার সাথে ব্যবহার করতে খুব ভাল।

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