Rust實現單例模式

Yundan發表於2024-10-13

前言

rust是基於C++實現的,所以對於rust來講,更適合的是程序導向的設計。不過,仍然可以基於rust採用一些物件導向的設計思想,本文主要講述如何透過rust語法實現單例模式。

一、什麼是單例模式?

單例模式是一種設計模式,用於確保一個類只有一個例項,並提供一個全域性訪問點。它常用於需要控制對某些資源的訪問,比如配置管理、日誌記錄或資料庫連線等。
單例模式的核心要素:

  • 私有建構函式:防止外部直接建立例項。
  • 靜態例項:在類內部建立一個靜態例項,確保只有一個例項存在。
  • 公共靜態方法:提供一個全域性訪問點,透過這個方法可以獲取到例項。

應用場景:

  • 配置管理:只需要一個配置類的例項來讀取配置。
  • 日誌系統:多個模組可能會使用同一個日誌例項來記錄資訊。
  • 資料庫連線:確保應用程式中只有一個資料庫連線例項。

透過單例模式,可以避免資源浪費和狀態不一致的問題。

二、demo舉例(rust)

use std::sync::{Arc, Mutex};

struct Singleton {
    // 單例資料
    data: String,
}

impl Singleton {
    // 獲取單例例項
    fn get_instance() -> Arc<Mutex<Singleton>> {
        // 使用 Arc 和 Mutex 來實現執行緒安全的單例
        static mut INSTANCE: Option<Arc<Mutex<Singleton>>> = None;
        unsafe {
            INSTANCE
                .get_or_insert_with(|| {
                    Arc::new(Mutex::new(Singleton {
                        data: String::from("Singleton instance"),
                    }))
                })
                .clone()
        }
    }
}

fn main() {
    // 獲取單例例項
    let instance1 = Singleton::get_instance();
    let instance2 = Singleton::get_instance();
    // 修改單例資料
    {
        let mut instance = instance1.lock().unwrap();
        instance.data = String::from("Modified singleton instance");
    }
    // 輸出單例資料
    {
        let instance = instance2.lock().unwrap();
        println!("{}", instance.data);
    }
}

三、Arc語法介紹

Arc(Atomic Reference Counted)是一種智慧指標,用於在多執行緒環境中安全地共享資料。Arc提供了對資料的共享所有權,並允許多個執行緒同時訪問同一資料,而無需擔心資料競爭。
Arc本身只提供對資料的共享引用,資料是不可變的;如果需要可變資料,可以與Mutex或RwLock結合使用。

四、Mutex語法介紹

Mutex(互斥鎖)是一種同步原語,用於確保在多執行緒環境中對共享資料的安全訪問。Mutex透過提供獨佔訪問來避免資料競爭。
自動釋放:當持有鎖的執行緒退出作用域時,Mutex會自動釋放鎖。

五、總結與反思

在Rust中,可以透過結合Arc和Mutex實現單例模式。

相關文章