মহিমান্বিত গ্লোবাল ভেরিয়েবল - গৌরবময় বৈশ্বিক শ্রেণিতে পরিণত হয়। কেউ কেউ বলেন অবজেক্ট ওরিয়েন্টড ডিজাইন।
পুরানো লগার যেখানে সিঙ্গলটন ব্যবহার করা বোধগম্যতা ব্যতীত আমাকে পরিস্থিতিগুলি দিন।
মহিমান্বিত গ্লোবাল ভেরিয়েবল - গৌরবময় বৈশ্বিক শ্রেণিতে পরিণত হয়। কেউ কেউ বলেন অবজেক্ট ওরিয়েন্টড ডিজাইন।
পুরানো লগার যেখানে সিঙ্গলটন ব্যবহার করা বোধগম্যতা ব্যতীত আমাকে পরিস্থিতিগুলি দিন।
উত্তর:
সত্যের জন্য আমার সন্ধানে আমি আবিষ্কার করেছি যে একটি মাত্র একক ব্যবহার করার জন্য খুব কম "গ্রহণযোগ্য" কারণ রয়েছে।
ইন্টারনেটগুলির উপর বার বার আসতে প্রবণতার একটি কারণ হ'ল "লগিং" শ্রেণি (যা আপনি উল্লেখ করেছেন)। এই ক্ষেত্রে, ক্লাসের একক উদাহরণের পরিবর্তে একটি সিঙ্গলটন ব্যবহার করা যেতে পারে কারণ একটি প্রকল্পে প্রতিটি শ্রেণীর দ্বারা সাধারণত একটি লগিং ক্লাস বারবার অ্যাড বমিভাব ব্যবহার করা প্রয়োজন। যদি প্রতিটি শ্রেণি এই লগিং ক্লাসটি ব্যবহার করে, নির্ভরতা ইনজেকশন জটিল হয়ে ওঠে।
লগিং একটি "গ্রহণযোগ্য" সিঙ্গলটনের একটি নির্দিষ্ট উদাহরণ কারণ এটি আপনার কোডের প্রয়োগকে প্রভাবিত করে না। লগিং অক্ষম করুন, কোড সম্পাদন একই থাকে remains এটি সক্ষম, একই। মিসকো এটিকে সিলেটলেটনের রুট কজ -এ নিম্নলিখিত পদ্ধতিতে রেখেছেন , "এখানে তথ্যগুলি একটি উপায় প্রবাহিত করে: আপনার অ্যাপ্লিকেশন থেকে লগারে। যদিও লগারগুলি বিশ্ব রাষ্ট্র, আপনার অ্যাপ্লিকেশনে লগার থেকে কোনও তথ্য প্রবাহিত না হওয়ায় লগার গ্রহণযোগ্য acceptable"
আমি নিশ্চিত যে অন্যান্য বৈধ কারণগুলিও রয়েছে। অ্যালেক্স মিলার, " প্যাটার্নস আই হেট "-তে, পরিষেবা লোকেটার এবং ক্লায়েন্টের পক্ষের ইউআইয়ের সম্ভবত "গ্রহণযোগ্য" পছন্দ হিসাবে কথা বলে।
সিঙ্গলটনে আরও পড়ুন আমি আপনাকে ভালোবাসি, তবে আপনি আমাকে নামিয়ে আনছেন।
একজন একক প্রার্থীকে অবশ্যই তিনটি প্রয়োজনীয়তা পূরণ করতে হবে:
যদি আপনার প্রস্তাবিত সিঙ্গলটনের মধ্যে এইগুলির মধ্যে একটি বা দুটি প্রয়োজনীয়তা থাকে তবে একটি পুনরায় নকশা প্রায় সবসময়ই সঠিক বিকল্প।
উদাহরণস্বরূপ, একটি মুদ্রক স্পুলার একাধিক স্থান (মুদ্রণ মেনু) থেকে কল করার সম্ভাবনা নেই, তাই আপনি একযোগে অ্যাক্সেস সমস্যা সমাধানের জন্য মিটেক্সেস ব্যবহার করতে পারেন।
একটি সাধারণ লগার সম্ভবত-বৈধ সিঙ্গলটনের সর্বাধিক সুস্পষ্ট উদাহরণ, তবে এটি আরও জটিল লগিং স্কিমগুলির সাথে পরিবর্তন করতে পারে।
কনফিগারেশন ফাইলগুলি পড়া যা কেবল প্রারম্ভকালে পড়তে হবে এবং সেগুলিকে একটি সিঙ্গেলনে আবদ্ধ করতে হবে।
Properties.Settings.Default
।
আপনি যখন একটি শেয়ার্ড রিসোর্স পরিচালনা করতে চান তখন আপনি একটি সিঙ্গলটন ব্যবহার করেন। উদাহরণস্বরূপ একটি প্রিন্টার স্পোলার। একই উত্সটির জন্য বিরোধী অনুরোধ এড়াতে আপনার অ্যাপ্লিকেশনটিতে কেবল স্পুলারের একক উদাহরণ থাকতে হবে।
অথবা একটি ডাটাবেস সংযোগ বা একটি ফাইল ম্যানেজার ইত্যাদি
কিছু বিশ্বব্যাপী রাষ্ট্র সংরক্ষণের জন্য কেবলমাত্র সিলেটলেটগুলি পড়ুন (ব্যবহারকারীর ভাষা, সহায়তা ফাইলপথ, অ্যাপ্লিকেশন পাথ) যুক্তিসঙ্গত। ব্যবসায়ের যুক্তি নিয়ন্ত্রণ করতে সিলেটলেটগুলি ব্যবহারে যত্নবান হন - একক প্রায় সর্বদা একাধিক হয়ে যায়
একটি ডাটাবেসে সংযোগ (বা সংযোগের পুল) পরিচালনা করা।
আমি এটি বাহ্যিক কনফিগারেশন ফাইলগুলিতে তথ্য পুনরুদ্ধার এবং সঞ্চয় করতে ব্যবহার করব।
আপনি সিঙ্গেলটনটি ব্যবহার করার একটি উপায় হ'ল একটি দৃষ্টান্তটি কভার করা যেখানে কোনও সংস্থায় কোনও একক "ব্রোকার" থাকতে হবে যা কোনও সংস্থার অ্যাক্সেস নিয়ন্ত্রণ করে। সিঙ্গলেটগুলি লগারে ভাল কারণ তারা কোনও ফাইলের অ্যাক্সেস ব্রোক করে, বলুন, যা কেবলমাত্র একা লেখা যেতে পারে। লগিংয়ের মতো কোনও কিছুর জন্য, তারা লগ ফাইলের মতো কিছুতে লেখাগুলিকে বিমূ of় করার একটি উপায় সরবরাহ করে - আপনি আপনার সিঙ্গেলটন ইত্যাদিতে ক্যাশেিং ব্যবস্থাটি মোড়তে পারেন ...
এমন একটি পরিস্থিতিটিও ভেবে দেখুন যেখানে আপনার অনেকগুলি উইন্ডোজ / থ্রেড / ইত্যাদি সহ একটি অ্যাপ্লিকেশন রয়েছে তবে এর জন্য একটি একক বিন্দু যোগাযোগ প্রয়োজন। আমি একবারে আমার অ্যাপ্লিকেশনটি চালু করতে চেয়েছিল এমন কাজগুলিকে নিয়ন্ত্রণ করতে একটি ব্যবহার করেছি। সিঙ্গলটনের কাজটি সিরিয়ালাইজ করার জন্য এবং আগ্রহী ছিল এমন প্রোগ্রামের যে কোনও অংশে তাদের স্থিতি প্রদর্শন করার জন্য দায়বদ্ধ ছিল। এই ধরণের দৃশ্যে, আপনি একটি সিঙ্গলটনের দিকে আপনার অ্যাপ্লিকেশনটির অভ্যন্তরে "সার্ভার" শ্রেণির মতো সাজানো হিসাবে দেখতে পারেন ... এইচটিএইচ
সম্পূর্ণ অ্যাপ্লিকেশন দ্বারা ভাগ করা কোনও রিসোর্সে অ্যাক্সেস পরিচালনা করার সময় একটি সিঙ্গলটন ব্যবহার করা উচিত এবং একই শ্রেণীর একাধিক উদাহরণ সম্ভবত এটি ধ্বংসাত্মক হবে। এই ধরণের প্যাটার্নটি অত্যাবশ্যক হতে পারে তার একটি খুব ভাল উদাহরণ যা ভাগ করা সম্পদ থ্রেডে নিরাপদে রয়েছে তা নিশ্চিত করা।
সিঙ্গলেটগুলি ব্যবহার করার সময়, আপনাকে অবশ্যই নিশ্চিত করা উচিত যে আপনি দুর্ঘটনাক্রমে নির্ভরতাগুলি গোপন করছেন না। আদর্শভাবে, অ্যাপ্লিকেশনটির জন্য আপনার প্রারম্ভিককরণ কোডটি কার্যকর করার সময় সিঙ্গেলনগুলি (অ্যাপ্লিকেশনে বেশিরভাগ স্ট্যাটিক ভেরিয়েবলের মতো) সেট করা হয় (সি # এক্সিকিউটেবলের জন্য স্ট্যাটিক শূন্য মূল (), জাভা এক্সিকিউটেবলের জন্য স্ট্যাটিক শূন্য মূল ()) এবং তারপরে পাস করা হয়েছে অন্যান্য সমস্ত ক্লাস যা তাত্ক্ষণিকভাবে এটি প্রয়োজন। এটি আপনাকে পরীক্ষার যোগ্যতা বজায় রাখতে সহায়তা করে।
সিঙ্গলটনের একটি ব্যবহারিক উদাহরণ টেস্ট :: বিল্ডারে পাওয়া যাবে , যে ক্লাসটি প্রতিটি আধুনিক পার্ল পরীক্ষার মডিউল সম্পর্কে প্রায় ব্যাক করে। টেস্ট :: বিল্ডার সিঙ্গলটন পরীক্ষার প্রক্রিয়াটির রাজ্য এবং ইতিহাস (andতিহাসিক পরীক্ষার ফলাফলগুলি, পরীক্ষাগুলির সংখ্যা গণনা করে) পাশাপাশি পরীক্ষার আউটপুট কোথায় চলেছে তার মতো জিনিসগুলি সংরক্ষণ করে এবং দালালগুলি। একক পরীক্ষার স্ক্রিপ্টে একসাথে কাজ করার জন্য বিভিন্ন লেখক দ্বারা লিখিত একাধিক পরীক্ষার মডিউলগুলি সমন্বয় করার জন্য এগুলি সমস্ত প্রয়োজনীয়।
পরীক্ষার ইতিহাস :: বিল্ডারের সিঙ্গলটন শিক্ষামূলক। কলিং new()
সর্বদা আপনাকে একই জিনিস দেয়। প্রথমত, সমস্ত ডেটা ক্লাস ভেরিয়েবল হিসাবে বস্তুটিতে কিছুই না রেখে সংরক্ষণ করা হয়েছিল। যতক্ষণ না আমি টেস্ট :: বিল্ডারকে নিজের সাথে পরীক্ষা করতে চেয়েছি এটি কাজ করে। তারপরে তার আচরণ এবং আউটপুট ক্যাপচার এবং পরীক্ষা করার জন্য আমার দুটি টেস্ট :: বিল্ডার অবজেক্টস, একটি ডামি হিসাবে একটি সেটআপ এবং একটি আসল পরীক্ষার বস্তু হওয়া দরকার। এই মুহুর্তে টেস্ট :: বিল্ডারকে একটি বাস্তব বস্তুতে রিফ্যাক্টর করা হয়েছিল। সিঙ্গলটন অবজেক্টটি ক্লাস ডেটা হিসাবে সংরক্ষণ করা হয়েছিল এবং new()
সর্বদা এটি ফিরিয়ে দেয়। create()
একটি তাজা বস্তু তৈরি এবং পরীক্ষার সক্ষম করতে যোগ করা হয়েছিল।
বর্তমানে, ব্যবহারকারীরা তাদের নিজস্ব মডিউলে টেস্ট :: নির্মাতার কিছু আচরণ পরিবর্তন করতে চাইছেন, তবে অন্যকে একা রেখে যান, যখন পরীক্ষার ইতিহাস সমস্ত পরীক্ষার মডিউলগুলিতে সাধারণ থাকে। এখন যা ঘটছে তা একচেটিয়া পরীক্ষা :: বিল্ডার অবজেক্টটি একটি পরীক্ষার সাথে ছোট টুকরো (ইতিহাস, আউটপুট, ফর্ম্যাট ...) কে বিভক্ত করা হচ্ছে: বিল্ডার দৃষ্টান্তগুলি সেগুলি একত্রিত করে। এখন পরীক্ষা :: বিল্ডার আর আর সিঙ্গলটন হতে হবে না। ইতিহাসের মতো এর উপাদানগুলিও হতে পারে। এটি সিঙ্গেলনের অবিচ্ছেদ্য প্রয়োজনীয়তাটিকে স্তরের নীচে ঠেলে দেয়। এটি ব্যবহারকারীকে মিক্স-টু মিক্সের আরও নমনীয়তা দেয়। ছোট সিঙ্গলটন অবজেক্টগুলি এখন কীভাবে এটি ব্যবহার করতে হবে তা স্থির করে এমন উপাদানগুলি সহ কেবলমাত্র ডেটা সংরক্ষণ করতে পারে। এমনকি এটি একটি নন-টেস্ট :: বিল্ডার শ্রেণিকে টেস্ট :: বিল্ডার ইতিহাস এবং আউটপুট একক ব্যবহার করে খেলতে দেয়।
মনে হয় ডেটার সামঞ্জস্যতা এবং আচরণের নমনীয়তার মধ্যে এক ধাক্কা ও টান রয়েছে যা ডেটা অখণ্ডতা নিশ্চিত করার জন্য যতটা সম্ভব স্বল্পতম আচরণের সাথে কেবল ভাগ করা ডেটাগুলির চারপাশে সিঙ্গলটন স্থাপনের মাধ্যমে প্রশমিত করা যায়।
আপনি যখন কোনও কনফিগারেশন প্রোপার্টি অবজেক্ট লোড করেন, তা হয় ডাটাবেস বা কোনও ফাইল থেকে, এটি সিঙ্গলটন হিসাবে রাখতে সহায়তা করে; স্ট্যাটিক ডেটা পুনরায় পড়ার কোনও কারণ নেই যা সার্ভার চলাকালীন পরিবর্তিত হবে না।
যেমনটি সবাই বলেছে, একটি ভাগ করা সংস্থান - বিশেষত এমন কিছু যা সমবর্তী অ্যাক্সেস পরিচালনা করতে পারে না।
একটি নির্দিষ্ট উদাহরণ যা আমি দেখেছি, সে হ'ল লুসিন অনুসন্ধান সূচক লেখক।
রাজ্য প্যাটার্নটি বাস্তবায়নের সময় আপনি সিঙ্গেলটন ব্যবহার করতে পারেন (জিওএফ বইয়ে দেখানো পদ্ধতিতে)। এটি কারণ কংক্রিটের রাজ্য শ্রেণীর নিজস্ব কোনও রাজ্য নেই এবং প্রসঙ্গ শ্রেণীর ক্ষেত্রে তাদের ক্রিয়া সম্পাদন করে।
আপনি বিমূর্ত কারখানাটি একটি সিঙ্গলটনও করতে পারেন।
setState()
রাষ্ট্র তৈরির নীতি সিদ্ধান্ত নেওয়ার জন্য আপনার দায়িত্ববান করার চেষ্টা করুন । আপনার প্রোগ্রামিংয়ের ভাষা যদি টেম্পলেট বা জেনেরিকগুলিকে সমর্থন করে তবে এটি সহায়তা করে। সিঙ্গলটনের পরিবর্তে আপনি মনসেটেট প্যাটার্নটি ব্যবহার করতে পারেন , যেখানে কোনও রাষ্ট্রের বস্তু ইনস্ট্যান্ট করে একই গ্লোবাল / স্ট্যাটিক স্টেট অবজেক্টটির পুনরায় ব্যবহার করা শেষ হয়। রাষ্ট্র পরিবর্তন করার বাক্য গঠনটি অপরিবর্তিত থাকতে পারে, কারণ আপনার ব্যবহারকারীদের সচেতন হওয়া উচিত নয় যে তাত্ক্ষণিক রাজ্যটি মনসেটেট।
ভাগ করা সংস্থানসমূহ। বিশেষত পিএইচপি, একটি ডাটাবেস ক্লাস, একটি টেম্পলেট শ্রেণি, এবং একটি বৈশ্বিক ভেরিয়েবল ডিপো ক্লাস। সমস্ত কোডটি জুড়ে ব্যবহৃত সমস্ত মডিউল / শ্রেণি দ্বারা ভাগ করে নিতে হবে have
এটি সত্যিকারের অবজেক্টের ব্যবহার -> টেমপ্লেট ক্লাসে তৈরি করা হচ্ছে এমন পৃষ্ঠা টেম্পলেট রয়েছে এবং এটি পৃষ্ঠা আউটপুটে যুক্ত হওয়া মডিউলগুলির দ্বারা আকার ধারণ, যুক্ত, পরিবর্তিত হয়। এটি একক উদাহরণ হিসাবে রাখতে হবে যাতে এটি ঘটতে পারে এবং ডাটাবেসের ক্ষেত্রেও এটি একই রকম হয়। একটি ভাগ করা ডাটাবেস সিঙ্গেলটন দিয়ে, সমস্ত মডিউলগুলির ক্লাসগুলি ক্যোয়ারিতে অ্যাক্সেস পেতে এবং সেগুলি পুনরায় চালু না করে সেগুলি পেতে পারে।
একটি গ্লোবাল ভেরিয়েবল ডিপো সিঙ্গলটন আপনাকে একটি বিশ্বব্যাপী, নির্ভরযোগ্য এবং সহজেই ব্যবহারযোগ্য ভেরিয়েবল ডিপো সরবরাহ করে। এটি আপনার কোডকে অনেক বড় করে তুলেছে। সিঙ্গলটনে যেমন অ্যারেতে সমস্ত কনফিগারেশন মান রয়েছে তা কল্পনা করুন:
$gb->config['hostname']
বা অ্যারেতে সমস্ত ভাষার মান থাকা যেমন:
$gb->lang['ENTER_USER']
পৃষ্ঠার কোড চালানোর শেষে, আপনি বলুন, এখন একজন পরিণত:
$template
সিঙ্গলটন, একটি সিঙ্গলটন $gb
যা এর পরিবর্তে ল্যাং অ্যারে রয়েছে এবং সমস্ত আউটপুট লোড এবং প্রস্তুত। আপনি তাদের এখনই কীগুলিতে প্রতিস্থাপন করুন যা এখন পরিপক্ক টেমপ্লেট অবজেক্টের পৃষ্ঠা মান হিসাবে উপস্থিত থাকে এবং তারপরে এটি ব্যবহারকারীর কাছে পরিবেশন করে।
এর দুর্দান্ত সুবিধা হ'ল আপনি যে কোনও কিছুতে নিজের পছন্দমতো পোস্ট-প্রসেসিং করতে পারেন। আপনি গুগল অনুবাদ, বা অন্য কোনও অনুবাদক পরিষেবাতে সমস্ত ভাষার মান পাইপ করতে পারেন এবং সেগুলি ফিরিয়ে আনতে পারেন এবং উদাহরণস্বরূপ, অনুবাদ করে তাদের জায়গায় প্রতিস্থাপন করতে পারেন। বা, আপনি পৃষ্ঠা কাঠামো, বা, কন্টেন্ট স্ট্রিংগুলিতে আপনি চান হিসাবে প্রতিস্থাপন করতে পারেন।
সুনিলেট বা গ্লোবাল ভেরিয়েবল হিসাবে নির্দিষ্ট অবকাঠামো উদ্বেগকে কনফিগার করতে এটি খুব ব্যবহারিক হতে পারে। আমার এটির প্রিয় উদাহরণ হ'ল ডিপেন্ডেন্সি ইনজেকশন ফ্রেমওয়ার্ক যা ফ্রেমওয়ার্কে সংযোগ পয়েন্ট হিসাবে কাজ করতে সিলেটলেটগুলি ব্যবহার করে।
এই ক্ষেত্রে আপনি গ্রন্থাগারটি ব্যবহার সহজ করার জন্য এবং অব্যবহৃত জটিলতা এড়াতে অবকাঠামোর উপর নির্ভরতা নিচ্ছেন।
প্লাগেবল মডিউলগুলির সাথে কাজ করার সময় আমি কোনও অবজেক্ট এনপ্যাপুলেটিং কমান্ড-লাইন পরামিতিগুলির জন্য এটি ব্যবহার করি। মূল প্রোগ্রামটি জানে না যে কমান্ড-লাইন পরামিতিগুলি মডিউলগুলি লোড হয়ে যায় তার জন্য (এবং সর্বদা এমনকি জানে না কী মডিউলগুলি লোড হচ্ছে)। উদাহরণস্বরূপ, প্রধান লোড এ, যার কোনও প্যারামিটার নিজেই প্রয়োজন নেই (সুতরাং এটি অতিরিক্ত পয়েন্টার / রেফারেন্স / যাই হোক না কেন, আমি নিশ্চিত নই - দূষণের মতো দেখায়), তারপরে এক্স, ওয়াই এবং জেড দুই এর মধ্যে এক্স এবং জেড বলুন, প্যারামিটারগুলির প্রয়োজন (বা স্বীকার করুন), তাই কোন পরামিতি গ্রহণ করা উচিত তা জানাতে তারা কমান্ড-লাইন সিঙ্গলটনে ফিরে কল করে এবং ব্যবহারকারীরা আসলে কোনও নির্দিষ্ট করে কিনা তা খুঁজে বের করার জন্য তারা রানটাইম ফিরে কল করে তাদের মধ্যে.
বিভিন্ন উপায়ে, সিজিআই প্যারামিটারগুলি পরিচালনা করার জন্য একটি সিঙ্গেলটন একইভাবে কাজ করবে যদি আপনি কেবলমাত্র ক্যোয়ারী অনুযায়ী একটি প্রক্রিয়া ব্যবহার করেন (অন্যান্য মোড_ * পদ্ধতিগুলি এটি না করে, তাই এটি সেখানে খারাপ লাগবে - এইভাবে যুক্তি যা আপনাকে বলবে না ' আপনি মোড_পার্ল বা যে কোনও বিশ্ববন্দরে পোর্ট করার ক্ষেত্রে Mod_cgi বিশ্বে সিঙ্গলেটগুলি ব্যবহার করবেন না।
কোড সহ একটি উদাহরণ, সম্ভবত।
এখানে, কংক্রিটরেজিস্ট্রি একটি জুজু গেমের একটি সিঙ্গলটন যা আচরণের সমস্ত উপায়ে প্যাকেজ ট্রিটিকে কয়েকটি, গেমের মূল ইন্টারফেসগুলিতে অ্যাক্সেস করতে দেয় (যেমন, মডেল, ভিউ, কন্ট্রোলার, পরিবেশ ইত্যাদি):
http://www.edmundkirwan.com/servlet/fractal/cs1/frac-cs40.html
এড।
1 - প্রথম উত্তরের একটি মন্তব্য:
আমি কোনও স্থির লগার শ্রেণীর সাথে একমত নই। এটি বাস্তবায়নের জন্য ব্যবহারিক হতে পারে তবে ইউনিট পরীক্ষার জন্য এটি প্রতিস্থাপনযোগ্য হতে পারে না। একটি স্ট্যাটিক শ্রেণি পরীক্ষার দ্বিগুণ দ্বারা প্রতিস্থাপন করা যায় না। আপনি যদি ইউনিট পরীক্ষা না করেন তবে আপনি সমস্যাটি এখানে দেখতে পাবেন না।
2 - আমি হাত দিয়ে একটি সিঙ্গলটন তৈরি না করার চেষ্টা করি। আমি কেবল কন্সট্রাক্টরগুলির সাথে একটি সাধারণ অবজেক্ট তৈরি করি যা আমাকে অবজেক্টে সহযোগীকারীদের ইনজেক্ট করতে দেয়। আমার যদি সিঙ্গলটনের প্রয়োজন হয় তবে আমি একটি নির্ভরতা ইনজেকশন ফ্রেমওয়ার্ক (স্প্রিং। নেট, নেট জন্য Nক্য, জাভার জন্য স্প্রিং) বা অন্য কিছু ব্যবহার করব।
ILogger logger = Logger.SingleInstance();
যেখানে এই পদ্ধতিটি স্থির এবং এটি কোনও আইলোগারের একটি স্ট্যাটিকালি সঞ্চিত উদাহরণ প্রদান করে। আপনি "একটি নির্ভরতা ইনজেকশন কাঠামো" উদাহরণ ব্যবহার করেছেন। প্রায় সমস্ত ডিআই পাত্রে সিলেটলেট; তাদের কনফিগারেশনগুলি স্থিতিশীলভাবে সংজ্ঞায়িত করা হয় এবং শেষ পর্যন্ত একক পরিষেবা সরবরাহকারী ইন্টারফেসে / সঞ্চিত থাকে।