ورود

نسخه کامل مشاهده نسخه کامل : کلاس Singleton



iranch
29-08-2013, 00:01
دروود امکانش هست کلاس سینگل تن رو شرح بدید؟ بدبختانه سایت ماکروسافت خیلی خیلی خیلی بد توضیح داده این مطلب رو :n03:

_H2_
02-09-2013, 19:25
سلام
کلاس هایی هستند که فقط باید یک نمونه (New) از آنها ساخته شود.
این کلاس ها معمولاً خدماتی کلی و مدیریتی را به کلیه کاربران و کلیه جلسات جاری کاری (Session) ارائه میدهند.
همچین کلاسی نباید درمقابل هر ریسمان (Thread) یا کاربر (User) یا جلسه کاری (Session) و... نمونه سازی شود و باید وضعیت و متغییرهایش برای همه حالات فوق حفظ شده و از اول جدید یا خالی نشود و اصولاً در این موارد معنی منطقی خاصی بر New شدن این کلاس ها وجود ندارد.

مثلاً
اگر در یک برنامه شبکه بخواهیم مدیریت کاربران آنلاین را داشته باشیم و Login و Logoff و کاربران آنلاین فعلی و... را بدانیم، بد نیست یک کلاس Singleton داشته باشیم که بین کاربران مشترک باشد (فقط یک نمونه New شده داشته باشد) و همه کاربران تحت عملیات های این کلاس Login و Logoff کنند و طبیعتاً این شی مشترک میتواند آمار دقیقی از کاربران آنلاین موجود هم ارائه دهد.

مثال دیگر
به عنوان نمونه شی Application در ASP.Net نوعی Singleton است.
نمونه این شی برای تمام ریسمان ها، کاربران، جلسات، درخواست ها (Request) یگانه بوده و همواره با دستور System.Web.[ برای مشاهده لینک ، لطفا با نام کاربری خود وارد شوید یا ثبت نام کنید ] قابل دریافت است.
بدلیل اشتراک نمونه این شی بین کلیه موارد فوق الذکر در یک وب سایت ASP.Net اصولاً معنی ندارد که کسی بخواهد آن را New کند! هر کدی در هرجایی این شی بگیرد نمونه واحدی (یک اشاره گر یکسان برای همه) دریافت میکند و به همین دلیل است که چیزی که به این کلاس Add میکنید در همه جای دیگر قابل دریافت است یا Lock آن عملکردی سرتاسری دارد.

و...

در واقع راه بدتر در مقابل Singleton آن است که یک static class با چند متد static و تعدادی متغییر static داشته باشید.

اگر فکر میکنید که در کلاسی به چندین متغییر بزرگ static نیاز دارید، احتمالاً Singleton راه حل منطقی تری خواهد بود.

البته لازم بذکر است که برخی مواقع نیمه Singleton هایی داریم که فقط در یک شرایط خاص یکتا هستند.
مانند شی Session در ASP.Net که در مقابل هر جلسه کاری (شما فرض کنید هر کاربر) یکتا و مشترک است.
در واقع شی Session در ASP.Net بین تمام ریسمان ها و درخواست های یک کاربر مشترک و تک است ولی در سرتاسر برنامه یکتا نیست و هر کاربر تک Session مختص خود را دارد و در نهایت در یکلحظه شاید چندین Session موجود باشد.
این قبیل نیمه Singleton ها هم با Singleton انحصاری کلی قابل پیاده سازی و تولید است.

==============

در نهایت تا مطمئن نشدید که به کلاسی مشترک در کل چروژه نیاز دارید از Singleton استفاده نکنید.
ترجیحاً تلاش کنید این کار را در پروژه تان در کمترین حد ممکن و فقط درصورت الزام منطقی انجام دهید.

موفق باشید.

shotok
03-09-2013, 11:05
بسم الله الرحمن الرحیم
با سلام
فرض بفرمائید قصد داریم کد کاربری که لاگین کرده رو در کل برنامه داشته باشیم تا هر عملیاتی که انجام داد در هر فرمی، کدش هم در بانک ذخیره شود.
در این حالت بهترین روش برای اینکه متغیر کد کاربر رو در تمامی فرم ها داشته باشیم چیست؟
با سپاس فراوان

_H2_
04-09-2013, 22:05
سلام
این بستگی به نوع برنامه دارد.
چون چیزی گفتید که در شرایطی میتواند چندگانه باشد.
در واقع میتواند یک Singleton کامل نباشد.

مثلاً اگر برنامه شما تحت وب باشد یا یک سرویس دهنده تحت TCP/IP باشد، همزمان چند User در یک برنامه خواهید داشت.
ولی
اگر برنامه شما یک نمونه عادی تحت شبکه با دیتابیس SQL Server باشد، پس آنگاه هر برنامه شما فقط یک کاربر آنلاین دارد که زمان لوگینش مشخص میشود و تا انتهای خروج از برنامه ثابت است، یعنی یک Singleton واقعی و کامل.

پس چون مثال خاصی زدید، اول باید مشخص شود برنامه و شرایطتان چیست.

shotok
04-09-2013, 23:03
بسم الله الرحمن الرحیم

پس چون مثال خاصی زدید، اول باید مشخص شود برنامه و شرایطتان چیست.
با سلام
برنامه تحت شبکه با دیتابیس SQL Server.
با سپاس فراوان

_H2_
05-09-2013, 00:31
سلام

برنامه تحت شبکه با دیتابیس SQL Server.
چون در این شرایط با یک Singleton کامل طرف هستیم (هرکاربری exe خودش را اجرا میکند) ، میتوان پایه را از کد بسیار ساده ای مانند این آغاز کرد

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
با کدساده ای مانند User.Current میتوان به مقادیر و فرامین مرتبط با کاربر جاری دسترسی پیدا کرد.
مثلاً در فرم لاگین میتوان متد User.Current.Login را اجرا کرد یا اگر بخواهید نام کاربر را در جایی نشان دهید میتوانید از User.Current.Title یا User.Current.Username استفاده کنید.
(((
البته اگر بخواهید کامل به User بپردازید، کارهای زیادی میتوان کرد که با پیاده سازی واسط های استاندارد IPrincipal و IIdentity شروع میشود ...
)))
شب خوش