-
Notifications
You must be signed in to change notification settings - Fork 0
Singleton
به طور کلی، الگوی طراحی سینگلتون زیرشاخۀ الگوهای طراحی Creational قرار میگیرد و به منظور محدود کردن ساخت آبجکت از روی برخی کلاسهای هزینهبر به کار گرفته میشود به طوری که تنها یک آبجکت از کلاس مذکور ساخته شده و مورد استفاده قرار میگیرد و از همین روی، الگوی طراحی سینگلتون در چنین شرایطی از اهمیت بالایی برخوردار بوده و منجر بدین خواهد شد تا آبجکتهای متعددی از روی کلاسی خاص ساخته نشده و تنها یک آبجکت ساخته شده و مورد استفاده قرار گیرد. در واقع سینگلتون یک دسترسی سراسری به تنها شیای که از یک کلاس ساخته شده است ایجاد میکند و اجازه ساخت شی جدیدی را از آن کلاس نمیدهد. منظور از کلاسهای هزینهبر کلاسهایی است که وظایف محولشده به آنها ممکن است هزینۀ بالایی از نظر زمان اجرا یا حافظۀ مصرفی برای اپلیکیشن داشته و منجر به کاهش سرعت آن نیز شوند.

همانطور که گفته شد، اگه شرایطی داریم که میخوایم فقط یک نمونه از یک کلاس سرتاسر برنامه وجود داشته باشه از این الگو استفاده میکنیم. همچنین اگه به دنبال یک راه محدود شده برای دسترسی به اون نمونه هستیم میتونیم از این الگو استفاده کنیم. چون الگوی Singleton امکان رو بهمون میده تا از راهی که خودش تعیین کرده به اون نمونه دسترسی داشته باشیم (در مقایسه با متغیرهای سراسری که کاملاً در معرض تغییرِ بدون محدودیت هستن).
- وظایف مربوط به اتصال به برخی سرویسهای API به طوری که به ازای هر بار اتصال هزینهای برای آن پرداخت شود
- برخی کلاسهایی که وظایفی همچون تشخیص نوع دیوایس مورد استفادۀ کاربر را بر عهده دارند که این امر ممکن است منجر به کاهش سرعت اپلیکیشن گردد
- رقراری کانکشن با دیتابیس که این موضوع نیز زمانبر بوده و تکرار مجدد آن در هر بار اجرا منجر به کاهش سرعت اپلیکیشن میگردد
- باعث افزایش tigh coupling بین کلاس های یک برنامه می شود و بدین ترتیب تغییر و بازسازی کد دشوار خواهد شد
- سینگلتون به دلیل اتصالی که در سراسر برنامه ایجاد میکند، اصلاح کد و ردیابی خطاها را دشوار میکند
- در زبانهایMulti-Thread هنگام ساختهشدن آبجکت ممکنه حالت Race Condition به وجود بیاد و در نتیجه چندین نمونه ساخته بشه
- (Eager initialization) آغازگر مشتاق
- (Static block initialization) آغازگر بلوک استاتیک
- (Lazy Initialization) آغازگر تنبل
- Thread Safe
- Bill Pugh

public class LazyInitializedSingleton {
private static LazyInitializedSingleton instance;
private LazyInitializedSingleton(){}
public static LazyInitializedSingleton getInstance(){
if(instance == null){
instance = new LazyInitializedSingleton();
}
return instance;
}
}// Java program implementing Singleton class
// with method name as that of class
// Class 1
// Helper class
class Singleton {
// Static variable single_instance of type Singleton
private static Singleton single_instance = null;
// Declaring a variable of type String
public String s;
// Constructor of this class
// Here private constructor is used to
// restricted to this class itself
private Singleton()
{
s = "Hello I am a string part of Singleton class";
}
// Method
// Static method to create instance of Singleton class
public static Singleton Singleton()
{
// To ensure only one instance is created
if (single_instance == null) {
single_instance = new Singleton();
}
return single_instance;
}
}
// Class 2
// Main class
class GFG {
// Main driver method
public static void main(String args[])
{
// Instantiating Singleton class with variable x
Singleton x = Singleton.Singleton();
// Instantiating Singleton class with variable y
Singleton y = Singleton.Singleton();
// instantiating Singleton class with variable z
Singleton z = Singleton.Singleton();
// Now changing variable of instance x
// via toUpperCase() method
x.s = (x.s).toUpperCase();
// Print and display commands
System.out.println("String from x is " + x.s);
System.out.println("String from y is " + y.s);
System.out.println("String from z is " + z.s);
System.out.println("\n");
// Now again changing variable of instance x
z.s = (z.s).toLowerCase();
System.out.println("String from x is " + x.s);
System.out.println("String from y is " + y.s);
System.out.println("String from z is " + z.s);
}
}
outputs:
String from x is HELLO I AM A STRING PART OF SINGLETON CLASS
String from y is HELLO I AM A STRING PART OF SINGLETON CLASS
String from z is HELLO I AM A STRING PART OF SINGLETON CLASS
String from x is hello i am a string part of singleton class
String from y is hello i am a string part of singleton class
String from z is hello i am a string part of singleton class