স্প্রিং পাত্রে সিঙ্গলটন ডিজাইনের প্যাটার্ন বনাম সিঙ্গলটন মটরশুটি


90

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

আমি আসলে কী বলতে চাইছিলাম তা ব্যাখ্যা করতে সক্ষম না হলে আমার সাথে সহ্য করুন।

উত্তর:


61

স্প্রিংয়ের একটি সিঙ্গলটন শিম এবং সিঙ্গলটনের প্যাটার্নটি একেবারেই আলাদা। সিঙ্গলটন প্যাটার্ন বলে যে ক্লাসলোডার প্রতি নির্দিষ্ট শ্রেণীর এক এবং একমাত্র উদাহরণ তৈরি করা হবে।

একটি স্প্রিং সিঙ্গলটনের সুযোগটিকে "প্রতি বিন প্রতি ধারক" হিসাবে বর্ণনা করা হয়। এটি স্প্রিং আইওসি পাত্রে প্রতি একক বস্তুর উদাহরণের জন্য বিন সংজ্ঞা দেওয়ার সুযোগ। স্প্রিং-এ ডিফল্ট সুযোগ হ'ল সিঙ্গলটন।

ডিফল্ট স্কোপটি সিঙ্গলটন হলেও, আপনি <bean ../>উপাদানটির স্কোপ বৈশিষ্ট্যটি নির্দিষ্ট করে শিমের ক্ষেত্র পরিবর্তন করতে পারেন ।

<bean id=".." class=".." scope="prototype" />

12
@ ইউজার 184794: প্রতি শিম প্রতি ধারক, মানে বসন্তের ধারায় কেবল একটি ক্লাসলোডার রয়েছে if যদি স্প্রিং পাত্রে দুই বা ততোধিক ক্লাসলোডার থাকে তবে প্রতিটি শ্রেণিবদ্ধার নিজস্ব উদাহরণ থাকতে পারে। এর অর্থ কি "প্রতি শিম প্রতি শ্রেণিচালক প্রতি ধারক"? দয়া করে পরিষ্কার করুন !!
ডেড প্রোগ্রামার

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

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

31

বসন্তে একক স্কোপ মানে বসন্তের প্রসঙ্গে একক উদাহরণ ..
স্প্রিং পাত্রে কেবল একই উদাহরণটি বার বার ফিরে আসে শিম পেতে পরবর্তী কলগুলির জন্য।


এবং বসন্ত বিরক্ত হয় না যদি শিমের শ্রেণিটি সিঙ্গলটন হিসাবে কোডড হয় বা না, প্রকৃতপক্ষে যদি শ্রেণিটি সিঙ্গলটন হিসাবে কোড্ড করা হয় যার নির্মাতা ব্যক্তিগত হিসাবে, বসন্তটি ব্যবহারযোগ্যকে অ্যাক্সেসযোগ্য এবং অনুরোধ করতে সেট করার জন্য BeanUtils.instantiateClass ( এখানে জাভাদোক ) ব্যবহার করে এটা।

বিকল্পভাবে, আমরা এর মতো শিম সংজ্ঞাতে একটি কারখানা-পদ্ধতি বিশিষ্টতা ব্যবহার করতে পারি

    <bean id="exampleBean" class="example.Singleton"  factory-method="getInstance"/>

4
আপনি কি ফ্যাক্টরি-পদ্ধতির বৈশিষ্ট্যটি নিশ্চিত? আমি নিশ্চিত যে বসন্ত কীভাবে কনস্ট্রাক্টর প্রাইভেট (সম্ভবত getInstance কল করার চেষ্টা করে) উদাহরণ পেতে কিভাবে জানে
inor

স্প্রিং কীভাবে এখানে
জিয়াউই ঝাং

22

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

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

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

সাধারণত আপনি যদি বসন্ত ব্যবহার করছেন তবে আপনার কেবলমাত্র উদাহরণ তৈরি করতে স্প্রিং ব্যবহার করা উচিত এবং ক্লাসের জন্য আপনার একজন পাবলিক কনস্ট্রাক্টর থাকতে পারেন। তবে যদি আপনার নির্মাতা ব্যক্তিগত না হন তবে আপনি স্প্রিংকে বাইজ করে সরাসরি কাউকে সরাসরি ক্লাসের নতুন দৃষ্টান্ত তৈরি করতে বাধা দিচ্ছেন না।

আপনি যদি সত্যই ক্লাসের একটি একক উদাহরণ চান, এমনকি আপনি যদি নিজের প্রয়োগে স্প্রিং ব্যবহার করেন এবং স্প্রিংয়ের ক্লাসটিকে সিঙ্গলটন হিসাবে সংজ্ঞায়িত করেন, তবে সিঙ্গেলটন প্যাটার্নটি ব্যবহার করে ক্লাসটি বাস্তবায়িত হয় তা নিশ্চিত করার একমাত্র উপায়। এটি নিশ্চিত করে যে কোনও একক উদাহরণ থাকবে, লোকেরা বসন্ত ব্যবহার করে উদাহরণ পেতে বা স্প্রিংকে বাইপাস করে whether


13

আমি " প্রতি বিন প্রতি কনটেইনার" ধরা শক্ত হয়ে পড়েছি । আমি বলব " একটি পাত্রে বিন প্রতি আইডিতে একটি শিম " itএটি বোঝার জন্য উদাহরণগুলির একটি উদাহরণ রয়েছে। আমাদের একটি বিন বিন ক্লাস রয়েছে। আমি এই শ্রেণি থেকে শিমের সংজ্ঞাতে দুটি মটরশুটি সংজ্ঞায়িত করেছি, যেমন:

<bean id="id1" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 001"/>    
</bean>    
<bean id="id7" class="com.example.Sample" scope="singleton">
        <property name="name" value="James Bond 007"/>    
</bean>

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

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


ভাল করে বুঝিয়েছি। ধন্যবাদ!
স্বপ্নিল

12

স্প্রিং-এর একক সুযোগের অর্থ এই শিমটি বসন্তের মাধ্যমে কেবল একবারই ইনস্ট্যান্ট করা হবে। প্রোটোটাইপ স্কোপের বিপরীতে (প্রত্যেকবার নতুন উদাহরণ), অনুরোধের সুযোগ (প্রতি অনুরোধের জন্য একবার), সেশন স্কোপ (এইচটিটিপি সেশন প্রতি একবার)।

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


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

4
বসন্ত আপনাকে সিঙ্গলটন প্যাটার্ন ব্যবহার করতে বাধ্য করে না।
অভিধান 19

2

স্প্রিং-এ সিঙ্গলটন মটরশুটি এবং একক ডিজাইন প্যাটার্নের ভিত্তিতে ক্লাসগুলি একেবারেই আলাদা are

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


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

2

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

উদাহরণস্বরূপ, "স্প্রিংটেষ্ট" নামটি সহ আমার যদি ক্লাস থাকে এবং আমার এক্সএমএল ফাইলটি এরকম কিছু দেখায়: -

<bean id="test1" class="com.SpringTest" scope="singleton">
        --some properties here
</bean>    
<bean id="test2" class="com.SpringTest" scope="singleton">
        --some properties here   
</bean>

সুতরাং এখন মূল শ্রেণিতে আপনি যদি উপরের দুটিটির রেফারেন্স পরীক্ষা করে দেখেন তবে এটি বসন্তের নথি অনুযায়ী মিথ্যা প্রত্যাবর্তন করবে: -

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

আমাদের ক্ষেত্রে যেমন ক্লাসগুলি একই তবে আমরা যে আইডি সরবরাহ করেছি তা পৃথক, ফলে দুটি পৃথক দৃষ্টান্ত তৈরি হয়।


2

সমস্ত উত্তর, এখন পর্যন্ত কমপক্ষে, নকশার প্যাটার্ন এবং স্প্রিং সিঙ্গলটনের মধ্যে পার্থক্য বোঝাতে মনোনিবেশ করুন এবং আপনার আসল প্রশ্নটির সমাধান করবেন না: একটি সিঙ্গলটন ডিজাইনের ধরণটি ব্যবহার করা উচিত বা একটি স্প্রিং সিঙ্গলটন বিন? এর চেয়ে ভাল কি?

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

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

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


1

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


1

EX: "প্রতি শিম প্রতি ধারক"।

        <bean id="myBean" class="com.spring4hibernate4.TestBean">
            <constructor-arg name="i" value="1"></constructor-arg>
            <property name="name" value="1-name"></property>
        </bean>

        <bean id="testBean" class="com.spring4hibernate4.TestBean">
            <constructor-arg name="i" value="10"></constructor-arg>
            <property name="name" value="10-name"></property>
        </bean>
    </beans>



    public class Test {

        @SuppressWarnings("resource")
        public static void main(String[] args) {
            ApplicationContext ac = new ClassPathXmlApplicationContext("ws.xml");
            TestBean teatBean = (TestBean) ac.getBean("testBean");
            TestBean myBean1 = (TestBean) ac.getBean("myBean");
            System.out.println("a : " + teatBean.test + " : "   + teatBean.getName());
            teatBean.setName("a TEST BEAN 1");
            System.out.println("uPdate : " + teatBean.test + " : "  + teatBean.getName());
            System.out.println("a1 : " + myBean1.test + " : " + myBean1.getName());
            myBean1.setName(" a1 TEST BEAN 10");
            System.out.println("a1 update : " + teatBean.test + " : " + myBean1.getName());
        }
    }

public class TestBean {
    public int test = 0;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    private String name = "default";

    public TestBean(int i) {
        test += i;
    }
}

জাভা সিঙ্গলটন:

public class Singleton {
    private static Singleton singleton = new Singleton();
    private int i = 0;

    private Singleton() {
    }

    public static Singleton returnSingleton() {

        return singleton;
    }

    public void increment() {
        i++;
    }

    public int getInt() {
        return i;
    }
}

public static void main(String[] args) {
        System.out.println("Test");

        Singleton sin1 = Singleton.returnSingleton();
        sin1.increment();
        System.out.println(sin1.getInt());
        Singleton sin2 = Singleton.returnSingleton();
        System.out.println("Test");
        sin1.increment();
        System.out.println(sin1.getInt());
    }

<বিন শ্রেণি = "com.spring4hibernate4.TestBean"> <কন্সট্রাক্টর-আরগ নাম = "আমি" মান = "1"> </ translation >- সম্পত্তি সম্পত্তি <= "নাম" মান = "1-নাম"> </ সম্পত্তি> </ বিবিএন> <বিন শ্রেণি = "com.spring4hibernate4.TestBean"> <কন্সট্রাক্টর-আরগ নাম = "আমি" মান = "10"> </ translation> -নেম "> </ p> </ বি> </
বি>>

1

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

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