Skip to content

Singleton

parisa edited this page Jun 14, 2022 · 2 revisions

الگو طراحی singleton



به طور کلی، الگوی طراحی سینگلتون زیرشاخۀ الگوهای طراحی Creational قرار می‌گیرد و به منظور محدود کردن ساخت آبجکت از روی برخی کلاس‌های هزینه‌بر به کار گرفته می‌شود به طوری که تنها یک آبجکت از کلاس مذکور ساخته شده و مورد استفاده قرار می‌گیرد و از همین روی، الگوی طراحی سینگلتون در چنین شرایطی از اهمیت بالایی برخوردار بوده و منجر بدین خواهد شد تا آبجکت‌های متعددی از روی کلاسی خاص ساخته نشده و تنها یک آبجکت ساخته شده و مورد استفاده قرار گیرد. در واقع سینگلتون یک دسترسی سراسری به تنها شی‌ای که از یک کلاس ساخته شده است ایجاد می‌کند و اجازه ساخت شی جدیدی را از آن کلاس نمی‌دهد. منظور از کلاس‌های هزینه‌بر کلاس‌هایی است که وظایف محول‌شده به آن‌ها ممکن است هزینۀ بالایی از نظر زمان اجرا یا حافظۀ مصرفی برای اپلیکیشن داشته و منجر به کاهش سرعت آن نیز شوند.



image





چه زمانی از الگوی singlton استفاده کنیم؟

همانطور که گفته شد، اگه شرایطی داریم که می‌خوایم فقط یک نمونه از یک کلاس سرتاسر برنامه وجود داشته باشه از این الگو استفاده می‌کنیم. همچنین اگه به دنبال یک راه محدود شده برای دسترسی به اون نمونه هستیم می‌تونیم از این الگو استفاده کنیم. چون الگوی Singleton امکان رو بهمون میده تا از راهی که خودش تعیین کرده به اون نمونه دسترسی داشته باشیم (در مقایسه با متغیرهای سراسری که کاملاً در معرض تغییرِ بدون محدودیت هستن).

چند مثال از وظایفی که نیاز به الگوی singleton دارند

  1. وظایف مربوط به اتصال به برخی سرویس‌های API به طوری که به ازای هر بار اتصال هزینه‌ای برای آن پرداخت شود
  2. برخی کلاس‌هایی که وظایفی همچون تشخیص نوع دیوایس مورد استفادۀ کاربر را بر عهده دارند که این امر ممکن است منجر به کاهش سرعت اپلیکیشن گردد
  3. رقراری کانکشن با دیتابیس که این موضوع نیز زمان‌بر بوده و تکرار مجدد آن در هر بار اجرا منجر به کاهش سرعت اپلیکیشن می‌گردد

معایب استفاده از الگوی طراحی سینگلتون

  1. باعث افزایش tigh coupling بین کلاس های یک برنامه می شود و بدین ترتیب تغییر و بازسازی کد دشوار خواهد شد
  2. سینگلتون به دلیل اتصالی که در سراسر برنامه ایجاد می‌کند، اصلاح کد و ردیابی خطاها را دشوار می‌کند
  3. در زبان‌هایMulti-Thread هنگام ساخته‌شدن آبجکت ممکنه حالت Race Condition به وجود بیاد و در نتیجه چندین نمونه ساخته بشه

انواع رویکردهای پیاده سازی سینگلتون

  1. (Eager initialization) آغازگر مشتاق
  2. (Static block initialization) آغازگر بلوک استاتیک
  3. (Lazy Initialization) آغازگر تنبل
  4. Thread Safe
  5. Bill Pugh

پیاده سازی الگوی سینگلتون با استفاده از روش lazy initialization

image

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

منابع

Is necessary

Design Pattern

Creational

Structural

Behavioral

Template

Clone this wiki locally