সিঙ্গলটন প্যাটার্নের বিকল্প


27

আমি সিঙ্গলটন প্যাটার্ন সম্পর্কে বিভিন্ন মতামত পড়েছি। কেউ কেউ মনে করেন যে এটি কোনও মূল্যে এড়ানো উচিত এবং অন্যরা এটি নির্দিষ্ট পরিস্থিতিতে কার্যকর হতে পারে।

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

F& f                   = F::instance();
boost::shared_ptr<A> a = f.createA();

আমার সাধারণ অবস্থা তাই

  1. আমার কাছে ক্লাসের কেবলমাত্র একটি উদাহরণ প্রয়োজন হয় অপ্টিমাইজেশনের কারণে (আমার একাধিক কারখানার জিনিস প্রয়োজন নেই) বা সাধারণ রাষ্ট্র ভাগ করে নেওয়ার জন্য (যেমন কারখানাটি জানে এটি এখনও কতগুলি উদাহরণ তৈরি করতে পারে)
  2. কোডের বিভিন্ন জায়গায় আমার এই দৃষ্টান্তের F এর অ্যাক্সেস পাওয়ার একটি উপায় দরকার।

এই প্যাটার্নটি ভাল বা খারাপ কিনা তা নিয়ে আমি আলোচনায় আগ্রহী নই তবে আমি ধরে নিচ্ছি যে আমি একটি সিঙ্গলটন ব্যবহার এড়াতে চাই, আমি আর কোন প্যাটার্ন ব্যবহার করতে পারি?

আমার ধারণাগুলি ছিল (1) একটি রেজিস্ট্রি থেকে কারখানার অবজেক্ট পেতে বা (2) প্রোগ্রাম শুরু করার সময় কারখানাটি তৈরি করতে এবং তারপরে কারখানাকে প্যারামিটার হিসাবে পাস করার জন্য।

সমাধান (1) এ, রেজিস্ট্রি নিজেই একটি সিঙ্গলটন, তাই আমি কারখানা থেকে একটি সিঙ্গলটন ব্যবহার না করে সমস্যাটিকে রেজিস্ট্রিতে সরিয়ে নিয়েছি।

ক্ষেত্রে (২) আমার কিছু প্রাথমিক উত্স (অবজেক্ট) প্রয়োজন যা থেকে কারখানার অবজেক্টটি আসে তাই আমি আশঙ্কা করি যে আমি আবার কোনও সিঙ্গলটনে ফিরে যেতে পারি (যে জিনিসটি আমার ফ্যাক্টরির উদাহরণ দেয়)। সিলেটনের এই চেইনটিকে অনুসরণ করে আমি সম্ভবত একক সিঙ্গলটনে (পুরো অ্যাপ্লিকেশনটি) সমস্যা কমাতে পারি যার দ্বারা অন্যান্য সমস্ত সিলেটলেট প্রত্যক্ষ বা পরোক্ষভাবে পরিচালিত হয়।

এই শেষ বিকল্পটি (একটি প্রাথমিক একক সিঙ্গলটন ব্যবহার করে যা অন্যান্য সমস্ত অনন্য অবজেক্ট তৈরি করে এবং সঠিক জায়গায় অন্য সমস্ত সিঙ্গেলনকে সংক্রামিত করে) এটি গ্রহণযোগ্য সমাধান হতে পারে? কেউ যদি সিলেটলেট ব্যবহার না করার পরামর্শ দেয় বা অন্য সমাধানগুলি কী, যেমন উপরে বর্ণিত উদাহরণে উদাহরণস্বরূপ, তখন কি এই সমাধানটিই সুস্পষ্টভাবে প্রস্তাব দেওয়া হয়?

সম্পাদনা

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

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

আমার বক্তব্যটি হ'ল মূল পদ্ধতির স্ট্যাকের উপরে থাকা কোনও একক বস্তু থেকে পুরো অবজেক্ট গ্রাফটি ইনস্ট্যান্ট না করা না হলে সর্বদা সিঙ্গলটন প্যাটার্নের মাধ্যমে কিছু অনন্য বস্তু অ্যাক্সেস করার প্রয়োজন থাকবে।

আমার প্রশ্নটি হ'ল সম্পূর্ণ অবজেক্ট গ্রাফ তৈরি এবং ওয়্যারিংগুলি মূল পদ্ধতির উপর নির্ভর করে (যেমন কিছু শক্তিশালী ডিআই ফ্রেমওয়ার্কের মাধ্যমে যা প্যাটার্নটি নিজেই ব্যবহার করে না) একমাত্র সিঙ্গলটন-প্যাটার্ন মুক্ত সমাধান।


8
নির্ভরতা ইনজেকশন ...
ফ্যালকন

1
@ ফ্যালকন: নির্ভরতা ইনজেকশন ... কী? ডিআই এই সমস্যাটি সমাধান করার জন্য কিছুই করে না, যদিও এটি প্রায়শই আপনাকে এটি গোপন করার সহজ উপায় দেয়।
পিডিআর

@ ফ্যালকন মানে কি আইওসি ধারক? এটি আপনাকে একক লাইনে নির্ভরতা সমাধান করতে দেয়। উদাহরণস্বরূপ নির্ভরতা es সমাধান <IFoo> (); বা নির্ভরতা <<IFoo> () সমাধান করুন .ডোসোমথিং ();
কোডার্ট

এটি বেশ পুরানো প্রশ্ন, এবং ইতিমধ্যে উত্তর দেওয়া। আমি এখনও এটির সাথে লিঙ্ক দেওয়া ভাল হবে: স্ট্যাকওভারফ্লো
TheSilverBullet

উত্তর:


7

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

আপনার কারখানাটি তৈরি করার জন্য কোনও কিছু আছে তা আপনি পেতে পারেন না । অ্যাপ্লিকেশন হতে যদি এটির কিছু ঘটে থাকে, তাই হোন। গুরুত্বপূর্ণ বিষয়টি হ'ল আপনার ফ্যাক্টরিটির যত্ন নেওয়া উচিত নয় কী কী বস্তুটি এটি তৈরি করেছে এবং যে জিনিসগুলি কারখানাটি গ্রহণ করে সেগুলি কারখানাটি এসেছে তা নির্ভর করে না depend আপনার জিনিসগুলি অ্যাপ্লিকেশন সিঙ্গলটনে একটি পয়েন্টার পেতে এবং কারখানার জন্য এটি জিজ্ঞাসা করবেন না; আপনার অ্যাপ্লিকেশনটি কারখানা তৈরি করুন এবং সেই জিনিসগুলিতে এটির প্রয়োজন হবে যা এটির প্রয়োজন হবে।


17

সিঙ্গলটনের উদ্দেশ্য হ'ল এটি প্রয়োগ করা যে কোনও একটি নির্দিষ্ট অঞ্চলের মধ্যে কেবলমাত্র একবারই বিদ্যমান থাকতে পারে। এর অর্থ হ'ল যদি সিঙ্গলটন আচরণ কার্যকর করার দৃ strong় কারণ থাকে তবে একটি সিঙ্গলটন কার্যকর; বাস্তবে, এটি খুব কম ক্ষেত্রেই হয়, এবং মাল্টি-প্রসেসিং এবং মাল্টি-থ্রেডিং অবশ্যই 'অনন্য' এর অর্থ অস্পষ্ট করে তোলে - এটি মেশিনের প্রতি, প্রতি প্রক্রিয়াতে, প্রতি থ্রেডে, প্রতি অনুরোধের কোনও উদাহরণ? এবং আপনার সিঙ্গলটন বাস্তবায়ন জাতি শর্তগুলির যত্ন নেয়?

সিঙ্গেলটনের পরিবর্তে, আমি দুটি ব্যবহার করতে পছন্দ করি:

  • স্বল্প-কালীন স্থানীয় দৃষ্টান্ত যেমন: কারখানার জন্য: সাধারণ কারখানার ক্লাসগুলিতে ন্যূনতম পরিমাণে রাষ্ট্র থাকে, যদি থাকে এবং তাদের উদ্দেশ্যটি সম্পাদনের পরে তাদের বাঁচিয়ে রাখার কোনও সত্য কারণ নেই; ক্লাস তৈরি এবং মুছে ফেলার ওভারহেড সমস্ত বাস্তব-বিশ্ব পরিস্থিতিতে 99% এর জন্য উদ্বেগের কিছু নয়
  • উদাহরণস্বরূপ একটি সংস্থান ম্যানেজারের জন্য পাস করা: এগুলি দীর্ঘকালীন হতে হবে, কারণ লোডিং সংস্থানগুলি ব্যয়বহুল এবং আপনি এগুলিকে স্মৃতিতে রাখতে চান, তবে আরও উদাহরণ তৈরি হতে বাধা দেওয়ার কোনও কারণ নেই - কে জানে, সম্ভবত কয়েকমাস রাস্তায় দ্বিতীয় সংস্থান ম্যানেজারটি বুদ্ধিমান হয়ে উঠবে ...

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


3
এটি খুব ভাল উত্তর তবে আমি কেন সিঙ্গলটন প্যাটার্নটি ব্যবহার করব / করব না তা সত্যিই জিজ্ঞাসা করছিলাম না। আমি জানি যে কেউ বিশ্বব্যাপী রাষ্ট্র নিয়ে আসতে পারে। যাইহোক, প্রশ্নের মূল বিষয়টি ছিল কীভাবে অনন্য জিনিস এবং কীভাবে একটি একক-প্যাটার্ন মুক্ত প্রয়োগ করা যায়।
জর্জিও

3

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

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

আপনি যে বিকল্পগুলি উদ্ধৃত করেছেন সেগুলি হ'ল রেফারেন্স পাওয়ার জন্য আলাদা ব্যবস্থার সাথে সিলেটলেটও। (২) কল স্ট্যাকের মূলের কাছাকাছি কেবল কয়েকটি স্থানে আপনার রেফারেন্সের প্রয়োজন না হলে পরিষ্কারভাবে খুব বেশি পরিমাণে পার হয়ে যায়। (1) একটি অশোধিত নির্ভরতা ইনজেকশন কাঠামোর মতো শোনাচ্ছে - তবে কেন এটি ব্যবহার করবেন না?

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

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

সুতরাং মূলত লোকেরা এতক্ষণে যে সেরা জিনিসটি সামনে এলো তা হ'ল আপনি যে দুটি বিকল্প উল্লেখ করেছেন তার একটি চৌকস সমন্বয়।


আপনি কি বোঝাতে চান যে বেসিক ধারণা নির্ভরতা ইনজেকশনটি মূলত আমি উপরের স্কেচ করা প্রথম পদ্ধতির (যেমন একটি রেজিস্ট্রি ব্যবহার করে), শেষ অবধি?
জর্জিও

@ জর্জিও: ডিআই সর্বদা এ জাতীয় একটি রেজিস্ট্রি অন্তর্ভুক্ত করে তবে মূল বিষয়টি যা এটি আরও ভাল করে তোলে তা হ'ল রেজিস্ট্রি অনুসন্ধান করার পরিবর্তে যেখানেই আপনার কোনও জিনিসের প্রয়োজন হবে না কেন, আপনার কাছে কেন্দ্রীয় উপাদান রয়েছে যা ট্রানজিটিভ পপুলেটযুক্ত, যা আমি উপরে লিখেছি।
মাইকেল বর্গওয়ার্ট

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

কিছু লোক (আপনি সহ) প্রশ্নগুলি মনোযোগ সহকারে পড়েন না এবং আসলে যা বলা হচ্ছে তা ভুল বুঝে না।
জর্জিও

1
@ জর্জিও: আপনার মূল প্রশ্নে কিছুই বোঝায় না যে আপনি ইতিমধ্যে নির্ভরতা ইনজেকশনের সাথে পরিচিত। এবং আপডেট উত্তর দেখুন।
মাইকেল বর্গওয়ার্ট

3

কয়েকটি বিকল্প রয়েছে:

ইনজেকশন নির্ভরতা

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

পরিষেবা রেজিস্ট্রি

প্রতিটি অবজেক্ট একটি পরিষেবা রেজিস্ট্রি অবজেক্ট পাস করা হয়। এটি বিভিন্ন পরিষেবাদি যা বিভিন্ন পরিষেবা সরবরাহ করে তাদের অনুরোধ করার পদ্ধতি সরবরাহ করে। অ্যান্ড্রয়েড কাঠামো এই প্যাটার্নটি ব্যবহার করে

রুট ম্যানেজার

একটি একক বস্তু যা বস্তুর গ্রাফের মূল। এই অবজেক্টের লিঙ্কগুলি অনুসরণ করে অবশেষে অন্য কোনও অবজেক্ট পাওয়া যাবে। কোড দেখতে দেখতে ঝোঁক:

GetSomeManager()->GetRootManager()->GetAnotherManager()->DoActualThingICareAbout()

উপহাস ছাড়াও ডিআইয়ের একটি সিঙ্গলটন ব্যবহারের কী সুবিধা রয়েছে? এটি এমন একটি প্রশ্ন যা আমাকে খুব দীর্ঘ সময় ধরে ফেলেছে। রেজিস্ট্রি এবং রুট ম্যানেজার হিসাবে, তারা কি সিঙ্গলটন হিসাবে বা ডিআইয়ের মাধ্যমে বাস্তবায়ন করা হয় না? (বস্তুত, আইওসি ধারক হয় একটি রেজিস্ট্রি, ডান?)
কনরাড রুডলফ

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

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

সিঙ্গলটনের ব্যবহার কোনও একক অবজেক্ট ধরে নেয় না যদি সিঙ্গলটন একটি ইন্টারফেস প্রয়োগ করে (বা এমনকি না হলেও) এবং আপনি Singleton::instanceক্লায়েন্ট কোডের যে কোনও জায়গায় জিজ্ঞাসা না করে সিঙ্গলটন উদাহরণটি পদ্ধতিগুলিতে পাস করেন pass
কনরাড রুডল্ফ

@ কনরাডরুডল্ফ, তারপরে আপনি সত্যিই কিছু সংকর একক / ডিআই পদ্ধতির ব্যবহার করছেন। আমার পিউরিস্ট পক্ষ মনে করে যে আপনার একটি খাঁটি ডিআই পদ্ধতির জন্য যাওয়া উচিত। তবে সিঙ্গলটনের বেশিরভাগ সমস্যাগুলি সত্যই সেখানে প্রয়োগ হয় না।
উইনস্টন এওয়ার্ট

1

যদি সিঙ্গলটন থেকে আপনার চাহিদাগুলি একক ফাংশনে সিদ্ধ করা যায় তবে কেন কেবল সাধারণ কারখানার ফাংশনটি ব্যবহার করবেন না? সংস্থাপক এবং লিঙ্কারের দ্বারা স্বতন্ত্রতা প্রয়োগের সাথে গ্লোবাল ফাংশন (সম্ভবত আপনার উদাহরণে ক্লাস এফের একটি স্থিতিশীল পদ্ধতি) সহজাতভাবে সিঙ্গলেটন are

class Factory
{
public:
    static Object* createObject(...);
};

Object* obj = Factory::createObject(...);

স্বীকারযোগ্যভাবে, যখন সিঙ্গলটনের ক্রিয়াকলাপটি একটি একক ফাংশন কলের ক্ষেত্রে হ্রাস করা যায় না তখনই এটি ভেঙে যায়, যদিও সম্ভবত সম্পর্কিত কিছু ছোট ফাংশন আপনাকে এনে দিতে পারে।

যা যা বলা হচ্ছে, আপনার প্রশ্নের 1 এবং 2 আইটেমগুলি এটি পরিষ্কার করে দেয় যে আপনি সত্যিই কেবল কিছু চান। সিঙ্গলটন প্যাটার্নটির আপনার সংজ্ঞা অনুসারে আপনি হয় ইতিমধ্যে এটি ব্যবহার করছেন বা খুব কাছাকাছি। আমি মনে করি না এটি সিঙ্গলটন বা কমপক্ষে একটির খুব কাছাকাছি না থাকলে আপনার একটির কিছু থাকতে পারে। এটি সিঙ্গলটনের অর্থের খুব কাছাকাছি।

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


4
ব্যক্তিগতভাবে আমি এটি কেবলমাত্র একক প্যাটার্নের ভিন্ন প্রয়োগ হিসাবে দেখছি। এক্ষেত্রে একক উদাহরণটি বর্গ নিজেই। বিশেষত: এটিতে "রিয়েল" সিঙ্গলটনের মতো সমস্ত ত্রুটি রয়েছে।
জোচিম সউর

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

1

আপনি যদি সি ++ বা পাইথনের মতো বহুবিধ ভাষা ব্যবহার করে থাকেন তবে সিঙ্গেলটন শ্রেণীর একটি বিকল্প হ'ল নাম স্থানে মোড়ানো ফাংশন / ভেরিয়েবলগুলির একটি সেট।

ধারণামূলকভাবে বলতে গেলে, ফ্রি গ্লোবাল ভেরিয়েবল, ফ্রি গ্লোবাল ফাংশন এবং তথ্য গোপনের জন্য ব্যবহৃত স্ট্যাটিক ভেরিয়েবল সহ একটি সি ++ ফাইল, যা একটি নেমস্পেসে আবৃত, আপনাকে সিঙ্গেলটন "শ্রেণি" হিসাবে প্রায় একই প্রভাব দেয়।

যদি আপনি উত্তরাধিকার চান তবেই এটি ভেঙে যায়। আমি অনেকগুলি সিলেটলেট দেখেছি যা এইভাবে ভাল হত।


0

সিঙ্গলেটস এনক্যাপসুলেশন

কেস দৃশ্য। আপনার অ্যাপ্লিকেশনটি অবজেক্ট ওরিয়েন্টেড, এবং আপনার আরও ক্লাস থাকলেও 3 বা 4 নির্দিষ্ট সিলেটলেট প্রয়োজন।

উদাহরণের আগে (সি ++ সিউডোকোডের মতো):

// network info
class Session {
  // ...
};

// current user connection info
class CurrentUser {
  // ...
};

// configuration upon user
class UserConfiguration {
  // ...
};

// configuration upon P.C.,
// example: monitor resolution
class TerminalConfiguration {
  // ...
};

একটি উপায় হ'ল কিছু (গ্লোবাল) সিলেটলেটগুলি আংশিকভাবে মুছে ফেলা, তাদের সকলকে একটি অনন্য সিঙ্গলটনে আবদ্ধ করে, যার সদস্য হিসাবে রয়েছে অন্যান্য সিলেটলেটস।

এইভাবে, "বেশ কয়েকটি সিঙ্গেলন, অ্যাপ্রোচ, বনাম, কোনও সিঙ্গলটন নেই, অ্যাপ্রোচ" এর পরিবর্তে আমাদের কাছে "সমস্ত সিঙ্গেলনকে এক, অ্যাপ্রোপুলেট" থাকে।

উদাহরণের পরে (সি ++ সিউডোকোডের মতো):

// network info
class NetworkInfoClass {
  // ...
};

// current user connection info
class CurrentUserClass {
  // ...
};

// configuration upon user
// favorite options menues
class UserConfigurationClass {
  // ...
};

// configuration upon P.C.,
// example: monitor resolution
class TerminalConfigurationClass {
  // ...
};

// this class is instantiated as a singleton
class SessionClass {
  public: NetworkInfoClass NetworkInfo;
  public: CurrentUserClass CurrentUser;
  public: UserConfigurationClass UserConfiguration;
  public: TerminalConfigurationClass TerminalConfiguration;

  public: static SessionClass Instance();
};

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

এছাড়াও বিবেচনা করার মতো অন্যান্য বিষয় রয়েছে, কারণ, ব্যবহৃত প্রোগ্রামিং ভাষাটি কীভাবে আপনার সিঙ্গলটন বা নন সিঙ্গেলটন বাস্তবায়নকে প্রভাবিত করতে পারে।

চিয়ার্স।


0

আপনার মূল প্রয়োজনীয়তা:

আমার সাধারণ অবস্থা তাই

  1. আমার কাছে ক্লাসের কেবলমাত্র একটি উদাহরণ প্রয়োজন হয় অপ্টিমাইজেশনের কারণে (একাধিক কারখানার আইটেমগুলির প্রয়োজন নেই) বা সাধারণ রাষ্ট্র ভাগ করে নেওয়ার জন্য (যেমন কারখানাটি জানে এটির কতগুলি> উদাহরণ এখনও তৈরি করতে পারে)
  2. কোডের বিভিন্ন জায়গায় আমার এই দৃষ্টান্তের F এর অ্যাক্সেস পাওয়ার একটি উপায় দরকার।

একটি সিঙ্গলটনের সংজ্ঞা (এবং আপনি বরং পরে কী উল্লেখ করেন) এর সাথে মিল রাখবেন না। জিওএফ থেকে (আমার সংস্করণটি 1995 এর) পৃষ্ঠা 127:

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

আপনার যদি কেবলমাত্র একটি উদাহরণ প্রয়োজন, এটি আপনাকে আরও তৈরি করা থেকে বিরত রাখে না ।

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

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


0

আইওসি পাত্রে ব্যবহার সম্পর্কে কীভাবে? কিছু ভেবে আপনি এর লাইনে কিছু দিয়ে শেষ করতে পারেন:

Dependency.Resolve<IFoo>(); 

IFooকোনও প্রারম্ভকালে কোন প্রয়োগটি ব্যবহার করতে হবে তা আপনাকে নির্দিষ্ট করতে হবে তবে এটি পরে একসাথে কনফিগারেশন যা আপনি সহজেই প্রতিস্থাপন করতে পারেন। একটি সমাধান করা দৃষ্টান্তের লাইফটাইম সাধারণত একটি আইওসি ধারক দ্বারা নিয়ন্ত্রিত হতে পারে।

স্ট্যাটিক সিঙ্গলটন শূন্য পদ্ধতিটি এর সাথে প্রতিস্থাপন করা যেতে পারে:

Dependency.Resolve<IFoo>().DoSomething();

স্ট্যাটিক সিঙ্গলটন গেটর পদ্ধতিটি এর সাথে প্রতিস্থাপন করা যেতে পারে:

var result = Dependency.Resolve<IFoo>().GetFoo();

উদাহরণ নেট। NET- এর সাথে প্রাসঙ্গিক, তবে আমি নিশ্চিত যে অন্যান্য ভাষায় খুব অনুরূপভাবে অর্জন করা যেতে পারে।

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