▫️ دو نکته کلیدی در هنگام ساخت کلاس سینگلتون باید رعایت شود:
- سطح دسترسی تمامی کنستراکتور های کلاستان را باید پرایوت تعریف کنید تا از این کلاس هیچ نمونه ای قابل ایجاد شدن نباشد.
- در کلاستان یک نمونه استاتیک از همین کلاس تعریف کنید. به گونه ای که دسترسی به این نمونه از طریق یک متد استاتیک صورت گیرد.
برای مثال:
class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
حالا یک کلاس سینگلتون ساده ایجاد کرده ایم. پس اگر ما از الگوی سینگلتون در کلاس خود استفاده کرده باشیم کد زیر باید خروجی معادل true داشته باشد: (ترو به معنای برابر بودن هر دو نمونه ایجاد شده یا اشاره هر دو نمونه به یک خانه از حافظه دارد)
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); //prints true
}
}
❓ کاربرد کلاس سینگلتون
در حالت کلی اگر بخواهید از کلاستان فقط یک نمونه در کل برنامه وجود داشته باشد میتوانید از این الگو استفاده کنید. برای مثال برای جابجایی داده ها در میان کلاس ها و یا برای اتصال برنامه به دیتابیس میتوانیم از این الگو استفاده کنیم. برای مثال:
import java.util.NoSuchElementException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Database db1;
// refers to the only object of Database
db1= Database.getInstance();
db1.getConnection();
}
}
class Database {
private static Database dbObject;
private Database() {
}
public static Database getInstance() {
// create object if it's not already created
if(dbObject == null) {
dbObject = new Database();
}
// returns the singleton object
return dbObject;
}
public void getConnection() {
System.out.println("You are now connected to the database.");
}
}
پس با توجه به الگوی سینگلتون، در برنامه بالا کافیست فقط یکبار متد getInstance صدا زده شود تا برنامه به دیتابیس متصل شود.
💬 مثال اول اگه دقت کرده باشید، instance رو بیرون از متد getInstance مقدار دهی کردیم درصورتی که تو مثال بعدی، اینکار رو درصورت نال بودن dbObject در متد getInstance انجام دادیم. به اینکار Lazy Loading گفته میشه. یعنی نمونه تنها در زمانی ساخته میشه که لازم باشه که همین میتونه باعث صرفه جویی در مصرف منابع بشه.
#design_patterns #singleton #gof
————
☕️ @PIECEJAVA
- سطح دسترسی تمامی کنستراکتور های کلاستان را باید پرایوت تعریف کنید تا از این کلاس هیچ نمونه ای قابل ایجاد شدن نباشد.
- در کلاستان یک نمونه استاتیک از همین کلاس تعریف کنید. به گونه ای که دسترسی به این نمونه از طریق یک متد استاتیک صورت گیرد.
برای مثال:
class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return instance;
}
}
حالا یک کلاس سینگلتون ساده ایجاد کرده ایم. پس اگر ما از الگوی سینگلتون در کلاس خود استفاده کرده باشیم کد زیر باید خروجی معادل true داشته باشد: (ترو به معنای برابر بودن هر دو نمونه ایجاد شده یا اشاره هر دو نمونه به یک خانه از حافظه دارد)
public class Main {
public static void main(String[] args) {
Singleton s1 = Singleton.getInstance();
Singleton s2 = Singleton.getInstance();
System.out.println(s1 == s2); //prints true
}
}
❓ کاربرد کلاس سینگلتون
در حالت کلی اگر بخواهید از کلاستان فقط یک نمونه در کل برنامه وجود داشته باشد میتوانید از این الگو استفاده کنید. برای مثال برای جابجایی داده ها در میان کلاس ها و یا برای اتصال برنامه به دیتابیس میتوانیم از این الگو استفاده کنیم. برای مثال:
import java.util.NoSuchElementException;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Database db1;
// refers to the only object of Database
db1= Database.getInstance();
db1.getConnection();
}
}
class Database {
private static Database dbObject;
private Database() {
}
public static Database getInstance() {
// create object if it's not already created
if(dbObject == null) {
dbObject = new Database();
}
// returns the singleton object
return dbObject;
}
public void getConnection() {
System.out.println("You are now connected to the database.");
}
}
پس با توجه به الگوی سینگلتون، در برنامه بالا کافیست فقط یکبار متد getInstance صدا زده شود تا برنامه به دیتابیس متصل شود.
💬 مثال اول اگه دقت کرده باشید، instance رو بیرون از متد getInstance مقدار دهی کردیم درصورتی که تو مثال بعدی، اینکار رو درصورت نال بودن dbObject در متد getInstance انجام دادیم. به اینکار Lazy Loading گفته میشه. یعنی نمونه تنها در زمانی ساخته میشه که لازم باشه که همین میتونه باعث صرفه جویی در مصرف منابع بشه.
#design_patterns #singleton #gof
————
☕️ @PIECEJAVA
👍10