Skip to content

Latest commit

 

History

History
120 lines (83 loc) · 7.64 KB

File metadata and controls

120 lines (83 loc) · 7.64 KB

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

الگوی طراحی Singleton یکی از الگوهای پرکاربرده که به‌خصوص توی سیستم‌های نهفته و دستگاه‌های IoT کاربرد داره. این الگو کمک می‌کنه که مطمئن بشیم فقط یک نمونه از یک کلاس یا ماژول توی کل برنامه وجود داره و همه بخش‌های برنامه به همون نمونه دسترسی دارن.

سناریو: مدیریت تنظیمات سیستم در یک دستگاه IoT با الگوی Singleton

فرض کن که داری یک دستگاه IoT می‌سازی که قراره توی خونه‌ها نصب بشه و با استفاده از اینترنت کنترل بشه. این دستگاه چندین ماژول مختلف داره، مثلاً یکی برای ارتباط شبکه، یکی برای مدیریت انرژی، و یکی برای سنسورهای مختلف مثل دما و رطوبت.

حالا تصور کن که این دستگاه تنظیماتی داره مثل IP شبکه، نوع ارتباط (WiFi یا Ethernet)، و حتی تنظیمات صرفه‌جویی در انرژی. این تنظیمات باید توی کل دستگاه ثابت و یکسان باشن و همه ماژول‌ها به این تنظیمات دسترسی داشته باشن. برای اینکه از این اتفاقات جلوگیری کنیم، می‌تونیم از الگوی Singleton استفاده کنیم.

مرحله 1: تعریف متغیر استاتیک برای نگهداری تنظیمات

اولین قدم اینه که یک متغیر استاتیک تعریف کنیم که فقط یک بار توی کل برنامه ایجاد بشه و همه جا به همون دسترسی داشته باشن.

// 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();

مرحله 2: پیاده‌سازی Singleton برای تنظیمات سیستم

حالا باید تابعی بنویسیم که اطمینان بده فقط یک نمونه از 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;
}

مرحله 3: استفاده از Singleton در برنامه

حالا هر وقت بخوای توی هر جای برنامه به تنظیمات دسترسی داشته باشی، می‌تونی از این 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 که باید تنظیماتشون توی کل سیستم یکسان باشه، خیلی به درد می‌خوره.

تمرین‌های قابل پیاده‌سازی برای Singleton

تمرین‌های ویندوزی

شماره سوال بارم
1 یک کلاس Singleton به نام AppConfig بنویسید که شامل تنظیمات ساده‌ای مانند نام کاربری (username) و تم برنامه (theme) باشد. این کلاس باید متدی به نام get_instance داشته باشد که تنها نمونه Singleton را برمی‌گرداند. در تابع main، با استفاده از این Singleton، تنظیمات برنامه را مقداردهی کنید و سپس آنها را چاپ کنید. 3
2 یک کلاس Singleton به نام DatabaseConnection بنویسید که مسئولیت مدیریت یک اتصال پایگاه داده را برعهده دارد. این کلاس باید شامل متدهایی برای اتصال (connect) و قطع اتصال (disconnect) باشد. در تابع main، اتصال به پایگاه داده را برقرار کرده، یک عملیات ساده انجام دهید (مثلاً چاپ یک پیام)، و سپس اتصال را قطع کنید. 4

تمرین‌های سیستم‌های نهفته (Embedded)

شماره سوال بارم
3 یک Singleton برای مدیریت پورت سریال در یک میکروکنترلر (مثلاً AVR یا STM32) ایجاد کنید. این Singleton باید شامل تنظیماتی مانند نرخ ارسال (baud_rate) و پاریتی (parity) باشد. در برنامه اصلی، تنظیمات پورت سریال را مقداردهی کنید و سپس یک پیام از طریق پورت سریال ارسال کنید. 4
4 یک Singleton برای مدیریت تایمر در یک میکروکنترلر ایجاد کنید. این Singleton باید شامل تنظیماتی مانند پریود تایمر (timer_period) باشد. در برنامه اصلی، تایمر را مقداردهی کرده و آن را شروع کنید. سپس یک LED را در فواصل زمانی مشخص روشن و خاموش کنید. 5