رفتن به مطلب
انجمن اندروید ایران | آموزش برنامه نویسی اندروید و موبایل
  • android.png.1fab383bc8500cd93127cebc65b1dcab.png

پست های پیشنهاد شده

قبل از بحث درباره پیاده سازی Singleton، اجازه دهید یکسری سوالات پایه ای را مطرح کنیم و به آنها پاسخ دهیم.


هدف استفاده از Singleton Pattern

همانطور که از نام آن مشخص است، Singleton Pattern فقط اجازه می دهد یک نمونه از class ساخته شود.
چه زمانی نیاز داریم که یک نمونه از کلاس ساخته شود؟

خیلی وقت ها نیاز است که فقط یک نمونه از یک کلاس ساخته شود. مثلاً وقتی که نمی خواهیم وضعیت شی تغییر کند و یا می خواهیم class را به صورت stateless نگه داریم.

به عنوان مثال زمانی که می خواهید یکسری داده های master را یکجا بارگذاری کنید و اجازه دهید مصرف کنندگان داده به جای فراخوانی های متعدد، با ساخت یک نمونه از کلاس، یک فراخوانی به یک کلاس Singleton داشته باشند.

در حالت کلی، در هر برنامه Enterprise پیچیده، می توان به کلاس های Repository و لایه Data Access به صورت Singleton نگاه کرد. درحالیکه معمولاً نمی خواهیم وضعیت در این لایه ها حفظ شود.

از جمله مثال های دیگر می توان به بحث log گیری، تنظیمات (configuration)، Caching و غیره اشاره کرد که می توان آن ها را به صورت Singleton پیاده سازی کرد. چرا که نیاز به یک نقطه مرکزی و سراسری خواهیم داشت تا به این کلاس ها دسترسی داشته باشیم.

گذشته از توضیحات فوق، دیده شده است که برخی از برنامه نویسان بی تجربه یکسری نمونه های اضافی می سازند که نه نتها باعث سربار حافظه می شوند، بلکه کارایی برنامه را تحت تاثیر قرار می دهند.
چرا کلاس های static

به دلایل مختلفی نباید از کلاس های static استفاده کنیم. برخی از این دلایل عبارتند از:

·      موارد مختلفی هست هست که می خواهید Interface ها را در یک کلاس پیاده سازی کنید (برای مثال پیاده سازی IOC- بعداً به توضیح IOC خواهم پرداخت) و به جای پیاده سازی کلاس به صورت static، آن را به صورت Singleton پیاده سازی می کنیم.

·      در صورت نیاز، می توانید از یک کلاس singleton به صورت پارامتر یک متد استفاده کنید درحالیکه نمی توان این کار را با کلاس static انجام داد.
نکته مهم درباره کلاس های Singleton

ایده وضعیت یک کلاس از آنجا نشآت گرفته است که شما نیاز دارید یکسری هماهنگی در محیط های چند نخی (multi-threaded enviroments) ایجاد کنید.

اجازه دهید نگاهی به یک پیاده سازی ساده داشته باشیم.

در اولین مثال، یک Singleton با Lazy loading پیاده سازی شده است و تا زمانیکه فراخواننده، متد GetInstance را برای اولین بار فراخوانی نکند، نمونه ایجاد نمی شود.

   public class SingletonClass

   {

       private static SingletonClass instance = null;

       private SingletonClass()

       {


       }

       public static SingletonClass GetInstance

       {

           get

           {

               if (instance == null)

               {

                   instance = new SingletonClass();

               }

              return instance;

           }

       }

اجازه دهید مشکل هماهنگی، که در محیط های چند نخی با آن مواجه هستیم را بر طرف کنیم. برای همین منظور از یک مکانیزم دوقفله استفاده خواهیم کرد:

       private static SingletonClass instance = null;

       private static object lockMe = new object();

       private SingletonClass()

       {


       }

       public static SingletonClass GetInstance

       {

           get

           {

               

               if (instance == null)

               {

                   lock (lockMe)

                   {

                       if (instance==null)

                       {

                           instance = new SingletonClass();

                       }

                       

                   }

               }

               return instance;

           }

       }

و در آخر، Singleton با مقداردهی اولیه static. لطفاً توجه داشته باشید .NET Framework ایمنی thread در زمان مقداردهی اولیه تضمین می کند و دیگر نیازی نیست نگران مسائل هماهنگی باشیم. اگر چه دیگر از مزایای Lazy loading اشیاء برخوردار نخواهیم بود.

       private static SingletonClass instance = new SingletonClass();

       public SingletonClass()

       {


       }

       private static SingletonClass GetInstance

       {

           get

           {

               return instance;

           }

       }

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر
در در 1396/05/11, 01:45:39، Farzad Sarseifi گفته است :

قبل از بحث درباره پیاده سازی Singleton، اجازه دهید یکسری سوالات پایه ای را مطرح کنیم و به آنها پاسخ دهیم.


هدف استفاده از Singleton Pattern

همانطور که از نام آن مشخص است، Singleton Pattern فقط اجازه می دهد یک نمونه از class ساخته شود.
چه زمانی نیاز داریم که یک نمونه از کلاس ساخته شود؟

خیلی وقت ها نیاز است که فقط یک نمونه از یک کلاس ساخته شود. مثلاً وقتی که نمی خواهیم وضعیت شی تغییر کند و یا می خواهیم class را به صورت stateless نگه داریم.

به عنوان مثال زمانی که می خواهید یکسری داده های master را یکجا بارگذاری کنید و اجازه دهید مصرف کنندگان داده به جای فراخوانی های متعدد، با ساخت یک نمونه از کلاس، یک فراخوانی به یک کلاس Singleton داشته باشند.

در حالت کلی، در هر برنامه Enterprise پیچیده، می توان به کلاس های Repository و لایه Data Access به صورت Singleton نگاه کرد. درحالیکه معمولاً نمی خواهیم وضعیت در این لایه ها حفظ شود.

از جمله مثال های دیگر می توان به بحث log گیری، تنظیمات (configuration)، Caching و غیره اشاره کرد که می توان آن ها را به صورت Singleton پیاده سازی کرد. چرا که نیاز به یک نقطه مرکزی و سراسری خواهیم داشت تا به این کلاس ها دسترسی داشته باشیم.

گذشته از توضیحات فوق، دیده شده است که برخی از برنامه نویسان بی تجربه یکسری نمونه های اضافی می سازند که نه نتها باعث سربار حافظه می شوند، بلکه کارایی برنامه را تحت تاثیر قرار می دهند.
چرا کلاس های static

به دلایل مختلفی نباید از کلاس های static استفاده کنیم. برخی از این دلایل عبارتند از:

·      موارد مختلفی هست هست که می خواهید Interface ها را در یک کلاس پیاده سازی کنید (برای مثال پیاده سازی IOC- بعداً به توضیح IOC خواهم پرداخت) و به جای پیاده سازی کلاس به صورت static، آن را به صورت Singleton پیاده سازی می کنیم.

·      در صورت نیاز، می توانید از یک کلاس singleton به صورت پارامتر یک متد استفاده کنید درحالیکه نمی توان این کار را با کلاس static انجام داد.
نکته مهم درباره کلاس های Singleton

ایده وضعیت یک کلاس از آنجا نشآت گرفته است که شما نیاز دارید یکسری هماهنگی در محیط های چند نخی (multi-threaded enviroments) ایجاد کنید.

اجازه دهید نگاهی به یک پیاده سازی ساده داشته باشیم.

در اولین مثال، یک Singleton با Lazy loading پیاده سازی شده است و تا زمانیکه فراخواننده، متد GetInstance را برای اولین بار فراخوانی نکند، نمونه ایجاد نمی شود.


   public class SingletonClass

   {

       private static SingletonClass instance = null;

       private SingletonClass()

       {


       }

       public static SingletonClass GetInstance

       {

           get

           {

               if (instance == null)

               {

                   instance = new SingletonClass();

               }

              return instance;

           }

       }

اجازه دهید مشکل هماهنگی، که در محیط های چند نخی با آن مواجه هستیم را بر طرف کنیم. برای همین منظور از یک مکانیزم دوقفله استفاده خواهیم کرد:


       private static SingletonClass instance = null;

       private static object lockMe = new object();

       private SingletonClass()

       {


       }

       public static SingletonClass GetInstance

       {

           get

           {

               

               if (instance == null)

               {

                   lock (lockMe)

                   {

                       if (instance==null)

                       {

                           instance = new SingletonClass();

                       }

                       

                   }

               }

               return instance;

           }

       }

و در آخر، Singleton با مقداردهی اولیه static. لطفاً توجه داشته باشید .NET Framework ایمنی thread در زمان مقداردهی اولیه تضمین می کند و دیگر نیازی نیست نگران مسائل هماهنگی باشیم. اگر چه دیگر از مزایای Lazy loading اشیاء برخوردار نخواهیم بود.


       private static SingletonClass instance = new SingletonClass();

       public SingletonClass()

       {


       }

       private static SingletonClass GetInstance

       {

           get

           {

               return instance;

           }

       }

 

بسیار ممنونم از پاسخ کامل و عالیتون

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

  • مطالب مشابه

    • توسط hami develop
      سلام خدمت دوستان عزیز.
      من یک اپلیکیشن اندروید درست کردم و از کلاس service ارث بری کردم و هر دقیقه یک بار یک وب سایت را چک میکند و در صورتی که اطلاعات جدیدی در این وب سایت وجود داشته باشد به من یک نوتیفیکیشن میدهد.
      آیا بهتر است که از کلاس Worker ارث بری کنم تا برنامه وظایفی را انجام دهد؟
      نکته: در واقع می‌خواهم برنامه برای مدت طولانی اجرا شود و هیچ گاه متوقف نشود.
      اگر کسی از دوستان تجربه کار با Worker را دارد لطفا بفرمایند که اختلاف
      Worker 
      و
      Service 
      دقیقا چی هست و برای برنامه ای که همیشه در بک گراند در حال اجرا است، کدامیک بهتر است؟
      سپاس بی کران.
    • توسط AliAmani
      سلام.وقت بخیر.من به یه ارور بر خوردم. دیباگر attach نمیشه.لطفا راهنماییم کنید.
      اندروید استودیو را حذف و دوباره نصب کردم.avd جدید ایجاد کردم.adb را kill و بعد start کردم.اما درست نشد.
      مشکل فقط در پروژه های اندروید است و در پروژه های فلاتر مشکلی نیست.
      debug.pdf
    • توسط elecomco
      آیا می‌خواهید برنامه اندروید بعدی خود را بسازید ، اما مطمئن نیستید که کدام زبان برنامه‌نویسی برای شما بهترین انتخاب است؟ در این مقاله به زبان هایی خواهم پرداخت که برای توسعه برنامه های اندروید بعدی ممکن است از آنها استفاده کنم.
      اندروید پذیرفته ترین سیستم عامل موبایل در جهان است. اندروید توسط گوگل توسعه داده شد و یک سیستم‌عامل باز مبتنی بر لینوکس است. اندروید کاملا متن باز است و هر شرکت یا فردی می‌تواند آن را دانلود کرده و از آن برای محصولات خود استفاده کند. در اصل ، این سیستم عامل از طریق شرکت اندروید برای دوربین‌های دیجیتال و موبایل طراحی شد. شرکت اندروید در سال ۲۰۰۵ توسط گوگل خریداری شد. در حال حاضر ، ۲.۳ میلیارد تلفن هوشمند اندروید در جهان وجود دارد.
      اندروید نه تنها از دو میلیارد تلفن هوشمند ، لپ‌تاپ ، تبلت  و کامپیوترهای شخصی پشتیبانی میکند ، بلکه اندروید قلب تپنده میلیاردها دستگاهی است که در زندگی روزمره خود از آنها استفاده می‌کنید. برخی از این وسایل عبارتند از: تلویزیون ، سیستم‌های امنیت خانگی ، یخچال و فریزر ، باکس های تلویزیونی ، دوربین ها ، ماشین ها ، سیستم‌های ناوبری ، تبلت های هوشمند ، بازی رایانه‌ای و وسایل خانگی هوشمند.
      چه زبان‌های برنامه‌نویسی می‌توانند برای توسعه برنامه‌های کاربردی تلفن همراه به کار روند؟ در اینجا لیستی از رایج‌ترین زبان‌های برنامه‌نویسی برای توسعه برنامه‌های اندروید آورده شده است : 
      Java Kotlin #C Python ++C
      جاوا
      زبان جاوا محبوب‌ترین زبان برنامه‌نویسی در این زمینه است. جاوا یک زبان برنامه‌نویسی استاتیک ، همه منظوره و متن باز است. جاوا از زمان راه‌اندازی سیستم‌عامل اندروید , زبان برنامه‌نویسی اولیه این سیستم عامل بوده است . جاوا در شرکت سان میکروسیستمز توسط James Gosling در سال ۱۹۹۵ ساخته شد. این زبان برنامه نویسی در حال حاضر متعلق به اوراکل است.
      جاوا براساس ++c  ساخته شد تا یادگیری آن برای توسعه دهندگان ساده باشد. این زبان همراه با ++c بهترین زبان‌های برنامه‌نویسی برای دانشجویان و افراد تازه کار برای یادگیری اصول برنامه‌نویسی هستند. زبان جاوا توسط بسیاری از دانشگاه‌ها به عنوان اولین زبان برنامه‌نویسی برای آموزش به دانشجویان استفاده میشود.
      برخلاف زبان های سوئیفت، سی شارپ و کاتلین ممکن است جاوا زبان برنامه‌نویسی مدرنی نباشد و مانند زبان های دیگر مدام بروزرسانی نشود. با این حال , زبان جاوا نقطه شروعی را برای توسعه دهندگان جدید مشخص میکند. یادگیری زبان جاوا در مقایسه با کاتلین بسیار ساده‌تر است. اگر یک توسعه دهنده تازه کار هستید و میخواهید توسعه اندروید را یاد بگیرید , جاوا یکی از آسان‌ترین راه‌ها برای شروع است.
      کاتلین
      کاتلین یک زبان برنامه‌نویسی مدرن , دقیق , ایمن , شی گرا و سازگار با همه ی پلتفرم هاست که توسط یک شرکت نرم‌افزاری به نام JetBrains در سال ۲۰۱۱ ساخته شده‌است. این زبان برای ساخت نرم‌افزارهای کاربردی , برنامه های اندروید و برنامه‌های بومی استفاده می‌شود. در حال حاضر گوگل توسط شرکت گوگل پشتیبانی میشود.
      زبان کاتلین از زمان انتشار Android Studio ۳,۰ در اکتبر سال ۲۰۱۷  به عنوان زبان برنامه‌نویسی رسمی برای اندروید استفاده شده‌است. این زبان برای طراحی برنامه‌های کاربردی ، ساخت اپلیکیشن های مدرن و ارائه قابلیت‌های جدید برای توسعه دهندگان طراحی شده است. کاتلین برای شما سادگی , انعطاف‌پذیری و بهره‌وری را فراهم می آورد.
      کد های نوشته شده در این زبان نسبت به زبان جاوا کوتاه تر و تمیز تر است. برای پروژ های اندروید بعدی شدیدا ً توصیه می‌کنم که از این زبان استفاده کنید . 
      #C
      زبان #C توسط Anders Hejlsberg در مایکروسافت در سال ۲۰۰۰ ایجاد شد. سی شارپ یک زبان برنامه‌نویسی ساده ، انعطاف‌پذیر ، ایمن ، و متن باز است. این زبان یکی از پراستفاده ترین زبان‌های برنامه‌نویسی در جهان است. سی شارپ به توسعه‌دهندگان اجازه می‌دهد تا تمام برنامه‌های کاربردی از قبیل ویندوز ، کنسول‌ها ، برنامه‌های وب ، برنامه‌های موبایل ، و سیستم‌های backend را بسازند.
      برنامه نویسان سی شارپ می‌توانند برنامه‌های کاربردی ios و اندروید را با کمک Xamarin بسازند . Xamarin به عنوان بخشی از ویژوال استادیو ابزاری است که به توسعه دهندگان اجازه میدهد کدهای سی شارپ خود را به برنامه های بومی اندروید و یا ios تبدیل کنند. سی شارپ طراحان را قادر می‌سازد که برنامه‌های کاربردی ios بومی و اندروید را بدون آگاهی از یک زبان برنامه‌نویسی جدید بسازند.
      پایتون
      پایتون یکی از رایج‌ترین زبان‌های برنامه‌نویسی زمانه اخیر است. پایتون که توسط Guido van Rossum در سال ۱۹۹۱ ایجاد شد. این زبان متن باز ، سطح بالا و همه منظوره است. پایتون یک زبان برنامه‌نویسی پویا است که از پارادایم‌های توسعه شی گرا ، تابعی و رویه‌ای پشتیبانی می‌کند. این زبان در برنامه‌نویسی یادگیری ماشین بسیار محبوب است. در توسعه نرم‌افزار های اندروید ، پایتون جهت ایجاد کتابخانه‌ها ، توابع ، و دیگر وظایف پردازش به کار می‌رود .
      ++C
      ++C یکی از قدیمی‌ترین و محبوب‌ترین زبان‌های برنامه‌نویسی است. ++C برای ساختن رابط های کاربری یا صفحات برنامه استفاده نمی‌شود. در فرآیند توسعه اندروید ، ++C برای ساختن API ها و وظایف backend استفاده می‌شود. توسعه دهندگان front end درگیر توسعه ++C نیستند ، بلکه کارکرد این زبان بیشتر مربوط به API هاست که مربوط به بخش back-end است. کتابخانه های معروفی در + +C  وجود دارند که برای توسعه دهندگان Android در دسترس هستند و میتوانند از آنها در برنامه های خود استفاده کنند.

      نتیجه‌گیری
      اندروید رایجترین سیستم‌عامل در دنیا است. برای ساخت اپلیکیشن اندروید از دو زبان برنامه‌نویسی اصلی یعنی جاوا و کاتلین استفاده شده‌است. در حالی که زبان برنامه‌نویسی جاوا یک زبان برنامه‌نویسی قدیمی است اما زبان کاتلین یک زبان سریع واضح و در حال تکامل است. اگر شما یک توسعه دهنده جدید هستید و به تازگی می‌خواهید توسعه برنامه های اندرویدی را شروع کنید، پیشنهاد من به شما زبان کاتلین است.
             
    • توسط asghar.a83
      سلام دوستان خسته نباشید من یه باتن دارم که میخوام وقتی کاربر روش کلیک کنه یه ثانیه تغییر رنگ بده تا کاربر بفهمه کلیک کرده و از اون حالت بی روحی در بیاد میدونم خیلی سادس ولی تو کاتلین تازه کارم لطفا جواب بدید
    • توسط sina_f2000
      با سلام و خسته نباشید خدمت اساتید بزرگوار 
      یه درخواست داشتم امیدوارم کمکم کنید
      کد ارسال تصاویر یک دایرکتوری از قبل مشخص شده به سمت سرور میخاستم اگه لطف کنید کدش به همراه فایل php بفرستید ممنون میشم
         
  • فایل

×
×
  • اضافه کردن...