MaHdI-09

singleton

3 ارسال در این موضوع قرار دارد

سلام.singleton دقیقا چیه و به چه دردی میخوره و اگر ی آموزش خوب درموردش دارید ممنون میشم معرفی کنید.

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


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

قبل از بحث درباره پیاده سازی 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;

           }

       }

 

2 کاربر پسند شده است

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در در 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;

           }

       }

 

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

 

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


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

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط djsaeedkhan
      سلام. وقت بخیر.
      من یه برنامه اندروید درست کردم و داخلش با alarm-manager قرار دادم که یه کاری هر مثلا1 ساعت یکبار انجام بشه. الان درست کار میکنه و حتی اگر موبایل روشن خاموش بشه بازم کار میکنه.
      ولی اگر کاربر برنامه هایی که حافظه رم رو پاک میکنن(برنامه های غیرضروری یا باز) مثلا (Clean Master- Space Cleaner & Antivirus) یا اگر از تنظیمات رم گزینه پاک کردن، اجرا کنه  alarm-manager دیگه کار نمیکنه و تا برنامه دوباره باز نشه شروع به کار نمیشه.
      راهی هست که بشه این مشکل رو حل کرد باسپاس
       
      Intent alarmIntent = new Intent(getActivity(), ReceiverUpdateData.class); AlarmManager manager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE); manager.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), Integer.parseInt(newValue.toString())*60*1000, PendingIntent.getBroadcast(getActivity(), 0, alarmIntent, 0));  
    • توسط مهندس
      سلام دوستان
      من یک چند مدتیه که هر چی کتابخانه به پروژه ام اضافه میکنم در بخش دیپندنسی ، همیشه با پیغام زیر مواجه میشم، فرقی هم نداره برای همه ی کتابخانه ها این اتفاق میقته.
      ضمن اینکه سرعت اینترنتم بسیار عالی هست.
      پراکسی رو هم امتحان کردم؛ از قندشکن هم استفاده کردم ولی فایده ای نداره.
      در صورتیکه من قبلا به همین پروژه براحتی کتابخونه ادد میکردم.
      دوستان خواهش میکنم کمک کنید، چجوری از دست این خطا راحت بشم؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟

    • توسط مهندس
      سلام.
      من فایل های php ارتباط با سرورمو اپلود کردم در فایل public html و داخل برنامه هم ک url ست کردم برای ارتباط با سرور.
      الان یک مشکلی ک دارم بحث امنیته.
      مثلا ما تو وب سایت بحث کوکی ها و سشن ها رو داریم. 
      تو اندروید برای امنیت باید چیکار کنیم؟؟
      در ضمن مثلا فرض کنید url من https://www.android.com/app/register.php .
      حالا شما فرض کنید یه هکر براحتی میتونه ب این صفحه دسترسی پیدا کنه دیتا اینرزت کنه در دیتابیس.
      یا کلا در این ادرس https://www.android.com/app/ ب تمام فایل ها میتونه دسترسی پیدا کنه.

       
    • توسط niloobani
      سلام .به یک توسعه دهنده اپلیکیشن مسلط به ساخت اپلیکیشن برای اندروید و ios در یک شرکت معتبر نیاز دارم . لطفا در صورت داشتن شرایط به من پیام بدید
    • توسط snowman
      سلام
      یه برنامه کتاب الکترونیکی نوشتم که همه چیش درست کار میکنه فقط تو قسمت جستجوش گیر کردم. تو برنامه از sqlite برای دیتابیس استفاده کردم که شامل یه table هست .برنامه 4 قسمت داره که واسه هر قسمت یه اکتیویتی ساختم که با استفاده از لیست ویو اطلاعاتو نشون میده . تو قسمت جستجو نمیتونم آیتم رو به اکتیویتی مورد نظر پاس بدم .نمیدونم اصلا امکانش هست یا نه راستش این اولین برنامم هستش ممنون میشم راهنماییم کنیید.
      import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.EditText; import android.widget.ListView; import android.widget.RadioButton; import android.widget.RadioGroup; import android.widget.SimpleAdapter; import android.widget.Toast; import java.util.HashMap; import java.util.List; import uk.co.chrisjenx.calligraphy.CalligraphyContextWrapper; public class search extends AppCompatActivity { private DatabaseHandler db; private ListView resultListView; private List<HashMap<String , Object>> resultBooks; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_search); getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_RTL); resultListView = (ListView) findViewById(R.id.resultListView); db = new DatabaseHandler( getBaseContext() ); db.open(); if( db.getScreenState() == 1 ) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); } db.close(); } public void onBtnFindClick( View v ) { resultListView.setAdapter(null); RadioGroup rGroup = (RadioGroup) findViewById(R.id.rgItems); int selected_item_id = rGroup.getCheckedRadioButtonId(); RadioButton rbTitle = (RadioButton) findViewById(R.id.rbSearchByTitle); RadioButton rbContent = (RadioButton) findViewById(R.id.rbSearchByContent); String search_by = ""; if( selected_item_id == rbTitle.getId() ) { search_by = "title"; } else if( selected_item_id == rbContent.getId() ) { search_by = "content"; } EditText etSearchKey = (EditText) findViewById(R.id.txtSearchKey); if( etSearchKey.getText().length() < 1 ) { Toast.makeText( getBaseContext() , getString(R.string.search_error_enter_text) , Toast.LENGTH_SHORT ).show(); return; } String key = etSearchKey.getText().toString().trim(); String[] keys = key.split("\\s+"); String query = search_by + " LIKE '%" + keys[0] + "%'"; StringBuilder sb = new StringBuilder(); for( int i = 1; i < keys.length; i ++ ) { sb.append( " OR " + search_by + " LIKE '%" + keys[i] + "%'" ); } query = query + sb.toString(); /* title LIKE '%ali%' OR title LIKE '%reza%' OR ... */ showResultOfSearch(query); } public void showResultOfSearch(final String query ) { db.open(); resultBooks = db.getTableOfResultsOfSearch( query ); db.close(); if( resultBooks.size() < 1 ) { Toast.makeText( getBaseContext() , getString(R.string.search_error_not_found) , Toast.LENGTH_SHORT ).show(); return ; } String[] from = { "title" , "fav_flag" , "see_flag" }; int[] to = { R.id.txtTitle , R.id.setFav , R.id.setSee }; SimpleAdapter adb = new SimpleAdapter( getBaseContext() , resultBooks , R.layout.tbl_content_list_row , from , to ); resultListView.setAdapter(adb); resultListView.setOnItemClickListener( new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Intent i = new Intent(getBaseContext(), book_content4.class); String my_id = resultBooks.get(position).get("id").toString(); i.putExtra("id", my_id); startActivity(i); overridePendingTransition(R.anim.fade_in, R.anim.fade_out); } } ); } protected void attachBaseContext(Context newBase) { super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase)); } }  

  • دوره آموزشی اندروید ایران کانادا آموزش ویدئویی اندروید آموزش برنامه نویسی اندروید اندروید کاپ دوره آنلاین اندروید کتاب های آموزشی اندروید بسته آموزشی اندروید دوره برنامه نویسی اندروید آموزش Kotlin آموزش برنامه نویسی ios
  • فایل