কনস্ট্রাক্টর কখন ব্যবহার করবেন এবং কখন getInstance () পদ্ধতি (স্ট্যাটিক কারখানার পদ্ধতি) ব্যবহার করবেন?


84
  1. কখন এবং কীভাবে আমাদের কনস্ট্রাক্টর ব্যবহার করা উচিত

    Foo bar = new Foo();
    
  2. এবং কখন আমাদের কীভাবে getInstance () (স্থির কারখানার পদ্ধতি) ব্যবহার করা উচিত?

    Foo bar = Foo.getInstance();
    

এই দুই এর মধ্যে পার্থক্য কি? আমি সবসময় কনস্ট্রাক্টর ব্যবহার করেছি, তবে এর getInstance()পরিবর্তে আমার কখন ব্যবহার করা উচিত ?


আপনি নিজে ক্লাস লিখছেন? যদি তা না হয় তবে আপনি কী এমন কল দিচ্ছেন যা এটি সরবরাহ করে?
ক্রিস বি

সুতরাং, ক্লাস নিজেই বাস্তবায়ন মানে আমি সিঙ্গলটন প্যাটার্ন বাস্তবায়ন করছি, তাই না?
zengr

তুমি কলিং getInstance() করুন, অথবা আপনার একটি পদ্ধতি লেখার নামক getInstance()?
ক্রিস বি

4
যদি প্রশ্নটি কনস্ট্রাক্টর বনাম স্ট্যাটিক কারখানার পদ্ধতিগুলির বিষয়ে হয় তবে আমি স্পষ্ট করার এবং শিরোনাম পরিবর্তন করার পরামর্শ দিই।
পাস্কাল থিভেন্ট

@ জেঞ্জার: আপনার আপডেট 2 সম্পর্কিত, এটি এমন কারণ হতে পারে যে আপনি আপনার স্থির পদ্ধতির নামটি কনভেনশন অনুসারে করেন নি, যার নাম অনুসারে এই নামকরণ করা উচিত Foo.newInstance()Foo.getInstance()এটি একটি শ্রেণীর একক উদাহরণ পাওয়ার জন্য একটি সম্মেলন। আপনার উদাহরণটি সংশোধন করা উচিত এবং Foo.newInstance()পরিবর্তে ব্যবহার করা উচিত।
জেআরএল

উত্তর:


97

প্রত্যেকে সিলেটলেটগুলিতে ফোকাস করছে বলে আমি মনে করি যখন প্রশ্নটি আসলে কনস্ট্রাক্টর বনাম স্থির কারখানার পদ্ধতি সম্পর্কে ।

এটি আসলে হয় আইটেম 1: কনস্ট্রাকটর পরিবর্তে স্ট্যাটিক কারখানা পদ্ধতি বিবেচনা করুন এর কার্যকরী জাভা জশুয়া ব্লচ দ্বারা:

আইটেম 1: নির্মাতাদের পরিবর্তে স্থির কারখানার পদ্ধতিগুলি বিবেচনা করুন

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

public static Boolean valueOf(boolean b) {
    return b ? Boolean.TRUE : Boolean.FALSE;
}

নোট করুন যে স্ট্যাটিক ফ্যাক্টরি পদ্ধতিটি ডিজাইন প্যাটার্নগুলি থেকে কারখানার পদ্ধতি প্যাটার্নের মতো নয় [গামা 95, পি। 107]। এই আইটেমটিতে বর্ণিত স্থিতিশীল কারখানার পদ্ধতির ডিজাইনের প্যাটার্নগুলিতে কোনও সরাসরি সমতুল্য নেই ।

কোনও শ্রেণি তার ক্লায়েন্টকে নির্মাতাদের পরিবর্তে বা অতিরিক্ত হিসাবে স্থায়ী কারখানার পদ্ধতি সরবরাহ করতে পারে। পাবলিক কনস্ট্রাক্টরের পরিবর্তে স্থিতিশীল কারখানার পদ্ধতি সরবরাহের উভয় সুবিধা এবং অসুবিধা রয়েছে।

সুবিধা (বইয়ের উদ্ধৃতি):

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

অসুবিধাগুলি (এখনও বই উদ্ধৃত):

  • কেবল স্থিতিশীল কারখানার পদ্ধতি সরবরাহের প্রধান অসুবিধা হ'ল জনসাধারণ বা সুরক্ষিত নির্মাতারা ব্যতীত ক্লাসগুলি সাবক্ল্যাস করা যায় না।
  • স্ট্যাটিক কারখানা পদ্ধতির দ্বিতীয় অসুবিধা হ'ল তারা অন্যান্য স্থিতিশীল পদ্ধতি থেকে সহজেই পৃথক নয়।

8
শেষটি কিছুটা প্রশমিত করা যায়। আমি যখন কারখানার পদ্ধতিগুলি তৈরি করি তখন এটি পরিষ্কার করার জন্য আমার কাছে ফ্যাক্টরি নামে একটি স্ট্যাটিক অভ্যন্তর শ্রেণি থাকে এবং এতে বিভিন্ন নতুন ইনস্ট্যান্স পদ্ধতি থাকে। এটি অতীতে প্রায় সময় ধরে আমাকে বাঁচিয়েছে। :)
ধনী শুলার

@ কবার্টিকাস কারখানার পদ্ধতির জন্য নিবেদিত অভ্যন্তরীণ শ্রেণিটি একটি দুর্দান্ত ধারণা। আমি চেষ্টা করব, ধন্যবাদ।
ডেভ ও।

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

9

আপনার দুটি প্রশ্ন আছে: কখন আমাকে কোনও পদ্ধতি কল করাgetInstance() উচিত এবং কখন এটি তৈরি করতে হবে?

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

আপনি যদি কোনও getInstance()পদ্ধতি তৈরি করবেন কিনা তা সিদ্ধান্ত নিলে আপনি কী অর্জন করতে চাইছেন তা সিদ্ধান্ত নিতে হবে decide হয় আপনি চান না যে লোকেরা আপনার কনস্ট্রাক্টরকে কল করুন (আপনি একটি সিঙ্গলটন বা একটি কারখানা তৈরি করছেন ), বা আপনার আপত্তি নেই ( NumberFormatউপরের মতো, যেখানে তারা কলারের সুবিধার্থে কিছু বস্তুর সূচনা করছেন)।


দীর্ঘ সংক্ষিপ্ত বিবরণ? getInstance()আপনার নিজের কোডে পদ্ধতি তৈরি সম্পর্কে চিন্তা করবেন না । সময় কার্যকর হয় যখন তারা কার্যকর হবে, আপনি জানতে পারবেন। এবং সাধারণভাবে, আপনি যদি কোনও শ্রেণীর নির্মাতাকে কল করতে পারেন তবে ক্লাসটি কোনও getInstance()পদ্ধতি সরবরাহ করলেও আপনি সম্ভবত এটি করছেন বলে মনে করছেন ।


7

GetInstance পদ্ধতিগুলির জন্য ব্যবহারগুলি:

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

তবে বেশিরভাগ সময় আপনার অবজেক্টটি একটি সাধারণ পোজো হবে এবং সর্বসাধারণের ব্যবহার সর্বাধিক ব্যবহারিক এবং সুস্পষ্ট সমাধান।

U1: অন্য ক্লাস থেকে getInstance

একটি ভিন্ন শ্রেণীর উদাহরণ ফেরত দিতে:

public class FooFactory {
    public static Foo getInstance() {
        return new Foo();
    }
}

NumberFormat.getInstanceপদ্ধতিগুলি এগুলি করে কারণ তারা প্রকৃতপক্ষে উদাহরণগুলি ফেরত দেয় DecimalFormat

ইউ 2: একা সমস্যা

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


কারখানার প্যাটার্নের ক্ষেত্রে 'ক্রিয়েইনস্ট্যান্স' বা 'বিল্ডইনস্ট্যান্স' এর মতো অন্য পদ্ধতির নামটি আরও ভাল ফিট হতে পারে তবে এখনও প্রশ্নকর্তা কী চাইবে তার একটি সম্ভাব্য কেস (এখনও কিছুটা নিঃস্বাস্থ্যযুক্ত এবং আমার কাছে কিছু হোমওয়ার্কের মতো)
jdehaan

6

আপনি যদি উভয়ই ব্যবহার করতে পারেন তবে এটি খারাপভাবে প্রয়োগ করা একক প্যাটার্নের মতো শোনাচ্ছে ।

দ্বিতীয়টি বিকল্পটি ব্যবহার করুন যদি আপনি নিজের সিস্টেমে ক্লাসের কেবলমাত্র একটি একক দৃষ্টিকোণ চান এবং কনস্ট্রাক্টরকে তখন ব্যক্তিগত করে তোলেন।

শ্রেণীর বেশ কয়েকটি অবজেক্ট তৈরি করার অনুমতি দেওয়ার জন্য প্রথমে ব্যবহার করুন।

তবে আপনার ক্লাসটি দুটি সম্ভাবনা দেবেন না।

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


প্রশ্ন Updated, একটু বিভ্রান্তিকর, দুঃখিত ছিল
zengr


1

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


0

সিঙ্গলেটনগুলি মন্দ are আমি এর চারপাশের যে সমস্যাগুলি দেখেছি সেগুলি কোনও সিস্টেমের পুনরায় ব্যবহার বা প্রসারণযোগ্যতা সম্পর্কে নয় (যদিও আমি বুঝতে পারি যে এটি কীভাবে ঘটতে পারে) তবে আরও যাতে আমি একটি অস্পষ্ট বাগগুলি দেখেছি তার সংখ্যা গণনা করতে পারি না সিস্টেম যে একা থেকে উদ্ভূত।

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

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