الگوی طراحی Singleton یکی از الگوهای پرکاربرده که بهخصوص توی سیستمهای نهفته و دستگاههای IoT کاربرد داره. این الگو کمک میکنه که مطمئن بشیم فقط یک نمونه از یک کلاس یا ماژول توی کل برنامه وجود داره و همه بخشهای برنامه به همون نمونه دسترسی دارن.
فرض کن که داری یک دستگاه IoT میسازی که قراره توی خونهها نصب بشه و با استفاده از اینترنت کنترل بشه. این دستگاه چندین ماژول مختلف داره، مثلاً یکی برای ارتباط شبکه، یکی برای مدیریت انرژی، و یکی برای سنسورهای مختلف مثل دما و رطوبت.
حالا تصور کن که این دستگاه تنظیماتی داره مثل IP شبکه، نوع ارتباط (WiFi یا Ethernet)، و حتی تنظیمات صرفهجویی در انرژی. این تنظیمات باید توی کل دستگاه ثابت و یکسان باشن و همه ماژولها به این تنظیمات دسترسی داشته باشن. برای اینکه از این اتفاقات جلوگیری کنیم، میتونیم از الگوی Singleton استفاده کنیم.
اولین قدم اینه که یک متغیر استاتیک تعریف کنیم که فقط یک بار توی کل برنامه ایجاد بشه و همه جا به همون دسترسی داشته باشن.
// settings.h
typedef struct {
char ip_address[16];
int connection_type; // 0 برای WiFi و 1 برای Ethernet
int power_save_mode; // 0 خاموش و 1 روشن
} SystemSettings;
SystemSettings* get_system_settings();حالا باید تابعی بنویسیم که اطمینان بده فقط یک نمونه از SystemSettings توی کل برنامه ایجاد میشه. اگر این نمونه از قبل وجود نداشته باشه، اونو ایجاد میکنیم.
// settings.c
#include "settings.h"
#include <stdlib.h>
#include <string.h>
static SystemSettings* instance = NULL;
SystemSettings* get_system_settings() {
if (instance == NULL) {
instance = (SystemSettings*)malloc(sizeof(SystemSettings));
strcpy(instance->ip_address, "192.168.1.1");
instance->connection_type = 0; // پیشفرض WiFi
instance->power_save_mode = 0; // پیشفرض خاموش
}
return instance;
}حالا هر وقت بخوای توی هر جای برنامه به تنظیمات دسترسی داشته باشی، میتونی از این Singleton استفاده کنی.
// main.c
#include "settings.h"
#include <stdio.h>
void configure_network() {
SystemSettings* settings = get_system_settings();
printf("Configuring network with IP: %s\n", settings->ip_address);
if (settings->connection_type == 0) {
printf("Using WiFi\n");
} else {
printf("Using Ethernet\n");
}
}
void save_power() {
SystemSettings* settings = get_system_settings();
if (settings->power_save_mode) {
printf("Entering power save mode\n");
} else {
printf("Power save mode is off\n");
}
}
int main() {
configure_network();
save_power();
return 0;
}الگوی طراحی Singleton یک راه حل عالی برای اطمینان از اینه که فقط یک نمونه از یک سری تنظیمات یا دادهها توی کل برنامه وجود داشته باشه. این الگو توی دستگاههای IoT که باید تنظیماتشون توی کل سیستم یکسان باشه، خیلی به درد میخوره.
| شماره | سوال | بارم |
|---|---|---|
| 1 | یک کلاس Singleton به نام AppConfig بنویسید که شامل تنظیمات سادهای مانند نام کاربری (username) و تم برنامه (theme) باشد. این کلاس باید متدی به نام get_instance داشته باشد که تنها نمونه Singleton را برمیگرداند. در تابع main، با استفاده از این Singleton، تنظیمات برنامه را مقداردهی کنید و سپس آنها را چاپ کنید. |
3 |
| 2 | یک کلاس Singleton به نام DatabaseConnection بنویسید که مسئولیت مدیریت یک اتصال پایگاه داده را برعهده دارد. این کلاس باید شامل متدهایی برای اتصال (connect) و قطع اتصال (disconnect) باشد. در تابع main، اتصال به پایگاه داده را برقرار کرده، یک عملیات ساده انجام دهید (مثلاً چاپ یک پیام)، و سپس اتصال را قطع کنید. |
4 |
| شماره | سوال | بارم |
|---|---|---|
| 3 | یک Singleton برای مدیریت پورت سریال در یک میکروکنترلر (مثلاً AVR یا STM32) ایجاد کنید. این Singleton باید شامل تنظیماتی مانند نرخ ارسال (baud_rate) و پاریتی (parity) باشد. در برنامه اصلی، تنظیمات پورت سریال را مقداردهی کنید و سپس یک پیام از طریق پورت سریال ارسال کنید. |
4 |
| 4 | یک Singleton برای مدیریت تایمر در یک میکروکنترلر ایجاد کنید. این Singleton باید شامل تنظیماتی مانند پریود تایمر (timer_period) باشد. در برنامه اصلی، تایمر را مقداردهی کرده و آن را شروع کنید. سپس یک LED را در فواصل زمانی مشخص روشن و خاموش کنید. |
5 |