জিওএফ সিঙ্গলটন প্যাটার্নের কোনও কার্যকর বিকল্প আছে কি?


91

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

জিওএফ সিঙ্গলটন প্যাটার্নগুলির কি তাদের কোনও নির্দিষ্ট বিকল্প?

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

আপনার আর কি ধারণা আছে?

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


কি? এটি ভাল বা খারাপ না, তবে আমি কীভাবে এটি প্রতিস্থাপন করতে পারি? যে সমস্ত ভাবেন এটি ভাল বলে - তাদের অংশ নিবেন না। আপনি যে সমস্ত লোকেরা এটি খারাপ বলেছেন, আমি কীভাবে এটি ছাড়া বাঁচতে পারি তা দেখিয়ে প্রমাণ করুন। আমার কাছে আর্গুমেন্টিভ লাগছে।
এস .লট

@ কোডিং উইথআউট কমেন্টস: পুরো পোস্টটি পড়েছেন। "আপনি যদি সিঙ্গলেটন ঠিক আছে তবে উত্তর দিবেন না" এই ধারণাটি আমি পেয়েছিলাম।
এস .লট

4
ঠিক আছে, যদি এভাবেই আসে তবে আমি ক্ষমাপ্রার্থী। আমি ভেবেছিলাম মেরুকরণ এড়ানোর জন্য আমি গুরুত্বপূর্ণ পদক্ষেপ নিয়েছি। আমি ভেবেছিলাম যে আমি প্রশ্নটি এমনভাবে জিজ্ঞাসা করেছি যে সিঙ্গেলটনের প্রেমী এবং ঘৃণা উভয়ই প্রোগ্রামার হিসাবে আমাদের সবার পছন্দ থাকতে পারে - যেগুলি কেবল একটিই সঠিক উপায় নয়
কোডিংউইথআউটস কমেন্টস

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

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

উত্তর:


77

" প্যাটার্নস আই হেট " -তে অ্যালেক্স মিলার নিম্নলিখিতটি উদ্ধৃত করেছেন:

"যখন একটি সিঙ্গলটন উত্তরটির মতো মনে হয়, আমি এটি প্রায়শই বুদ্ধিমান হতে পারি:

  1. একটি ইন্টারফেস এবং আপনার সিঙ্গলটনের একটি ডিফল্ট বাস্তবায়ন তৈরি করুন
  2. আপনার সিস্টেমের "শীর্ষে" আপনার ডিফল্ট প্রয়োগের একক উদাহরণ তৈরি করুন। এটি একটি বসন্তের কনফিগারেশনে বা কোডে হতে পারে বা আপনার সিস্টেমের উপর নির্ভর করে বিভিন্ন উপায়ে সংজ্ঞায়িত হতে পারে।
  3. এটির প্রয়োজনীয় প্রতিটি উপাদানগুলিতে একক উদাহরণটি পাস করুন (নির্ভরতা ইনজেকশন)

4
আমি জানি এটি 5 বছরের কাছাকাছি, তবে আপনি কি এটির উপর প্রসারিত করতে পারেন? আমি মনে করি আমাকে শিখানো হয়েছিল যে সিঙ্গেলটন তৈরির সঠিক উপায়টি ছিল একটি ইন্টারফেস সহ। আমি যদি আগ্রহী যে আমি যা করছিলাম তা 'ঠিক আছে', এবং আমার মতো ভয়াবহ নয় I'd
পিওরফেরেট

97

সিঙ্গেলটনের কার্যকারণের সঠিক উপায়টি বুঝতে, আপনার সিঙ্গলেটনের (এবং সাধারণভাবে বিশ্বব্যাপী রাষ্ট্রের) সমস্যা কী তা বুঝতে হবে:

সিঙ্গেলনগুলি নির্ভরতা আড়াল করে।

কেন এটি গুরুত্বপূর্ণ?

কারণ আপনি যদি নির্ভরতাগুলি লুকিয়ে রাখেন তবে আপনি সংযুক্তির পরিমাণের ট্র্যাক হারাতে চান।

আপনি যে তর্ক করতে পারেন

void purchaseLaptop(String creditCardNumber, int price){
  CreditCardProcessor.getInstance().debit(creditCardNumber, amount);
  Cart.getInstance().addLaptop();
}

তুলনায় সহজ

void purchaseLaptop(CreditCardProcessor creditCardProcessor, Cart cart, 
                    String creditCardNumber, int price){
  creditCardProcessor.debit(creditCardNumber, amount);
  cart.addLaptop();
}

তবে কমপক্ষে দ্বিতীয় এপিআই পদ্ধতিটির সহযোগীদের কী তা হ'ল পরিষ্কার করে দেয়।

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


+1 সমস্যার মূল সম্পর্কে আলোচনা করার জন্য, কেবল এটির চারপাশে কীভাবে কাজ করা যায় তা নয়।
ফিল

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

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

@ হারিকরামসিংহ আপনি কাজ করতে সাবস্ক্রাইব / প্রকাশের প্যাটার্ন বা সিস্টেম-ওয়াইড ইভেন্ট বাস (যা অবশ্যই সংশ্লিষ্ট পক্ষগুলিতে ভাগ করা উচিত, একটি সিঙ্গলটন নয়) ব্যবহার করতে পারেন।
ভিক্টর সোরোকিন

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

14

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

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

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

class NeedyClass {

    private ExSingletonClass exSingleton;

    public NeedyClass(ExSingletonClass exSingleton){
        this.exSingleton = exSingleton;
    }

    // Here goes some code that uses the exSingleton object
}

এবং তারপরে, কারখানাটি।

class FactoryOfNeedy {

    private ExSingletonClass exSingleton;

    public FactoryOfNeedy() {
        this.exSingleton = new ExSingletonClass();
    }

    public NeedyClass buildNeedy() {
        return new NeedyClass(this.exSingleton);
    }
}

আপনি কেবল একবার আপনার কারখানা ইনস্ট্যান্ট করবেন, সেখানে এক্সসিংটনের একক ইনস্ট্যান্টেশন থাকবে। যতবার আপনি বিল্ডনিডিকে কল করবেন, নিডাই ক্লাসের নতুন উদাহরণটি এক্সসিংলেটনের সাথে বান্ডেল হবে।

আশা করি এটা কাজে লাগবে. কোন ভুল চিহ্নিত করুন।


4
আপনার কারখানাটি কেবলমাত্র একবার প্রাইভেট কনস্ট্রাক্টরের প্রয়োজন পরে তা নিশ্চিত করার জন্য এবং বিল্ডনিডি পদ্ধতিটি একটি স্ট্যাটিক পদ্ধতি হিসাবে সংজ্ঞায়িত করুন to
জুলিয়েন গ্রেনিয়ার

16
জুলিয়েন ঠিক বলেছেন, এই ফিক্সটির একটি মৌলিক ত্রুটি রয়েছে, যা আপনি স্পষ্টভাবে বলছেন যে আপনি কেবল একটি কারখানা ইনস্ট্যান্ট করতে পারবেন। যদি আপনি কেবলমাত্র একটি কারখানা ইনস্ট্যান্ট করা হয় তা নিশ্চিত করার জন্য প্রয়োজনীয় সতর্কতা অবলম্বন করেন (আলা কী জুলিয়েন বলেছিলেন) আপনি শেষ করেছেন ... একটি সিঙ্গলটন! বাস্তবে এই পদ্ধতিটি কেবল সিঙ্গলটনের শীর্ষে বিমূর্ততার একটি অপ্রয়োজনীয় স্তর যুক্ত করে।
বব সোমারস

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

এটিই আমি সেরা সমস্যার সমাধানটি দেখেছি যা সিঙ্গেলনগুলির সাথে ভুলভাবে সমাধান করা হয়েছে - প্রতিটি পদ্ধতি কলকে বিশৃঙ্খলা না করে নির্ভরতা যুক্ত করে (এবং তাই ইন্টারফেসটি নতুন করে ডিজাইন করে এবং এর নির্ভরতাগুলি পুনরুদ্ধার করে)। সামান্য পরিবর্তন আমার পরিস্থিতির জন্য উপযুক্ত যেখানে কেবল "সিঙ্গলটন" এর একটি উদাহরণ থাকা গুরুত্বপূর্ণ নয়, তবে এটি গুরুত্বপূর্ণ যে প্রত্যেকে ডিফল্টরূপে একই ঘটনা ভাগ করে নেবে (পরিবর্তনটি হ'ল: কারখানাটি ব্যবহার না করে স্ট্যাটিক ব্যবহার করুন বহিরাগতভাবে সাধারণ উদাহরণটি সেট করার পদ্ধতি, এবং নির্মাণের সময় সেই উদাহরণটি ব্যবহার করুন)।
মিউস্ট্রাস

সুতরাং মূলত এই পদ্ধতির সুবিধাটি হ'ল আপনাকে কেবল একটি অবজেক্ট দৃষ্টিকোণ (কারখানা) এর আশেপাশে ঘুরিয়ে ফেলতে হবে বরং সম্ভাব্যভাবে পুরো বস্তুগুলির একগুচ্ছ (যার জন্য আপনি সিঙ্গেলটন ব্যবহার না করা বেছে নিচ্ছেন)?
হরি করম সিং

9

বসন্ত বা অন্য কোনও আইওসি-কনটেইনার এতে যুক্তিসঙ্গতভাবে ভাল কাজ করে। যেহেতু অ্যাপ্লিকেশনের বাইরেই ক্লাসগুলি তৈরি করা এবং পরিচালনা করা হয়, তাই ধারকগুলি সহজ ক্লাসগুলি সিলেটলেট তৈরি করতে এবং যেখানে প্রয়োজন সেখানে সেগুলি ইনজেকশন করতে পারে।


উপরোক্ত বিষয়গুলি সম্পর্কে কোনও লিঙ্ক পেয়েছেন?
কোডিং উইথআউটকম্টমেন্টস

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

জন্য .NET: কাসল উইন্ডসর castleproject.org/container/index.html মাইক্রোসফট ইউনিটি msdn.microsoft.com/en-us/library/cc468366.aspx ইউনিটি আসলে একটি নির্ভরতা ইনজেকশন কাঠামো, কিন্তু এটা সম্ভবত এই বিষয়ের জন্য কাজ করব।
এরিক ভ্যান ব্রাকেল

4
কেন এর জন্য খুব বেশি ভোট নেই? আইওসি হ'ল সিঙ্গেলটন এড়ানোর নিখুঁত সমাধান।
সন্দীপ জিন্দাল

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

9

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

আমি সিঙ্গলটন প্যাটার্ন এড়াতে পারি না। হয় এটি উপযুক্ত এবং আমি এটি ব্যবহার করি বা এটি উপযুক্ত নয় এবং আমি এটি ব্যবহার করি না। আমি বিশ্বাস করি যে এটি এতটা সহজ।

সিঙ্গেলনের যথাযথতা (বা এর অভাব) পরিস্থিতির উপর নির্ভর করে। এটি একটি নকশার সিদ্ধান্ত যা অবশ্যই করা উচিত এবং সেই সিদ্ধান্তের পরিণতি অবশ্যই বুঝতে হবে (এবং ডকুমেন্টেড)।


আমি একই কথা বলতে যাচ্ছিলাম, তবে এটি তার প্রশ্নের পুরো উত্তর দেয় না :)
স্বাতী

4
আপনার উত্তরে যখন এটি উপযুক্ত বা উপযুক্ত না তখন দয়া করে কথা বলুন। খুব দয়া করে।
কোডিং উইথআউটকম্টমেন্টস

এটি প্রশ্নের উত্তর দেয়। আমার কাছে সিঙ্গেলটন প্যাটার্নটি এড়িয়ে যাওয়ার কৌশল নেই কারণ আমি এড়াতে আমার পথ থেকে দূরে যাই না এবং আমি মনে করি কোনও বিকাশকারীকে এটি করা উচিত।
থমাস

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

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

5

মনসেটেট (রবার্ট সি মার্টিনের অ্যাগিল সফটওয়্যার ডেভলপমেন্টে বর্ণিত) সিঙ্গলটনের বিকল্প। এই প্যাটার্নে শ্রেণীর ডেটা সমস্ত স্থিতিশীল তবে প্রাপ্ত / সেটাররা অ-স্থিতিশীল।

উদাহরণ স্বরূপ:

public class MonoStateExample
{
    private static int x;

    public int getX()
    {
        return x;
    }

    public void setX(int xVal)
    {
        x = xVal;
    }
}

public class MonoDriver
{
    public static void main(String args[])
    {
        MonoStateExample m1 = new MonoStateExample();
        m1.setX(10);

        MonoStateExample m2 = new MonoStateExample();
        if(m1.getX() == m2.getX())
        {
            //singleton behavior
        }
    }
}

মনসেটের সিঙ্গলটনের সাথে একই রকম আচরণ রয়েছে তবে প্রোগ্রামার এমনভাবে এমনভাবে আচরণ করে যেখানে কোনও সিঙ্গেলটন ব্যবহার হচ্ছে তা সত্যতা সম্পর্কে প্রোগ্রামার সচেতন নয়।


এটি আরও ভোটের দাবিদার; আমি গুগল থেকে মনোসেটের রিফ্রেশার সন্ধানে এখানে এসেছি!
মাহেমফ

@ মার্ক এটি আমার কাছে মনে হয় যে থ্রেড সুরক্ষার ক্ষেত্রে এই নকশাটি খুব শক্ত lock আমি কি মনোস্টেটএক্সেম্পলে প্রতিটি স্ট্যাটিক ভেরিয়েবলের জন্য একটি ইনস্টলস লক তৈরি করব, বা আমি এমন একটি লক তৈরি করব যা সমস্ত বৈশিষ্ট্য উত্তোলন করে? উভয়েরই মারাত্মক র‌্যামিকেশন রয়েছে যা সহজেই সিঙ্গেলটন প্যাটার্নে সম্পাদিত হয়।
মার্টিন ব্লিস

এই উদাহরণটি সিঙ্গেলটন প্যাটার্নের বিকল্প, তবে সিঙ্গলটন প্যাটার্নের সমস্যাগুলি সমাধান করে না।
সন্দীপ জিন্দাল

4

Singleton প্যাটার্ন বিদ্যমান কারণ সেখানে পরিস্থিতিতে একটি হয় একক বস্তুর পরিষেবার একটি সেট প্রদান প্রয়োজন হয়

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

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

*pseudocode* currentContainer.GetServiceByObjectType(singletonType)
//Under the covers the object might be a singleton, but this is hidden to the consumer.

পরিবর্তে একক গ্লোবাল

*pseudocode* singletonType.Instance

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

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

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


আমি আপনার সার্ভিসড পাত্রে উদাহরণটি পুরোপুরি অনুসরণ করি না। আপনি কি লিঙ্ক করতে পারে এমন একটি অনলাইন সংস্থান আছে?
কোডিংউইথআউটকম্টমেন্টস

"ক্যাসেল প্রজেক্ট - উইন্ডসর কনটেইনার" কাস্টেলপ্রজেক্ট.আর / কন্টেইনার / ইন্ডেক্স এইচটিএমএল দেখুন । দুর্ভাগ্যক্রমে এই বিষয় সম্পর্কে বিমূর্ত প্রকাশনা খুঁজে পাওয়া খুব কঠিন।
পপ ক্যাটালিন

2

যদি আপনি একটি একক ডেটা অবজেক্টকে উপস্থাপন করতে সিঙ্গলটন ব্যবহার করেন তবে আপনি পরিবর্তে কোনও পদ্ধতি পরামিতি হিসাবে কোনও ডেটা অবজেক্টটি পাস করতে পারেন।

(যদিও, আমি যুক্তি দিয়ে বলতে পারি যে এটি প্রথম স্থানে সিঙ্গলটন ব্যবহারের ভুল উপায়)


1

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

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


সিঙ্গেলনের পক্ষে বা বিপক্ষে কথা বলা ছাড়া, আমি অবশ্যই বলব যে এই সমাধানটি একটি বিরোধী-নিদর্শন। মাম্বলম্যানেজার একটি "গড ক্লাস" হয়ে ওঠে যা একক দায়িত্ব লঙ্ঘন করে সমস্ত ধরণের বৈষম্য জ্ঞান ধারণ করে। সমস্ত অ্যাপ্লিকেশন কেয়ারের জন্য এটি পাশাপাশি সিঙ্গলটনও হতে পারে।
মার্টিন ব্লিস

0

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


4
কারখানার প্রায়শই সিঙ্গলটন হয় না? আমি সাধারণত কারখানার নিদর্শনগুলি বাস্তবায়িত দেখতে পাই।
টমাস

0

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

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

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


0

ব্যক্তিগতভাবে আমার জন্য- সিঙ্গলটনের মতো আচরণ করে এমন কিছু বাস্তবায়নের আরও বুদ্ধিমানের উপায় হ'ল সম্পূর্ণ স্থিতিশীল শ্রেণি (স্থির সদস্য, স্থির পদ্ধতি, স্ট্যাটিক বৈশিষ্ট্য) ব্যবহার করা। বেশিরভাগ সময় আমি এটি এভাবে প্রয়োগ করি (ব্যবহারকারীর দৃষ্টিকোণ থেকে আমি কোনও আচরণের পার্থক্যের কথা ভাবতে পারি না)


0

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

যদি এটি হয় তবে আপনার একটি সিঙ্গলটন রয়েছে। আপনি যদি কোডিংয়ের সময় সুবিধার্থ হিসাবে সিলেটলেটগুলি ছুড়ে ফেলে থাকেন তবে আপনার সত্যই আপনার ডিজাইনের পুনর্বিবেচনা করা উচিত এবং সিডলেটনস বলে কোডিং বন্ধ করা উচিত :)

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


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

0

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


0

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

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

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


-1

আপনি কী বলতে চাচ্ছেন, এড়াতে আমার কৌশলগুলি কী?

এটিকে "এড়াতে", এর থেকে বোঝা যায় যে আমি অনেকগুলি পরিস্থিতি পেরিয়ে এসেছি যার মধ্যে সিঙ্গেলটন প্যাটার্নটি স্বাভাবিকভাবেই ভাল ফিট এবং তাই এই পরিস্থিতিগুলি হ্রাস করার জন্য আমাকে কিছু ব্যবস্থা নিতে হয়েছিল।

কিন্তু নেই। আমি সিঙ্গলটন প্যাটার্ন এড়াতে হবে না। এটি সহজভাবে উত্থিত হয় না।

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