話不多說,上代碼!
1. 使用Arc + Mutex
在這個例子中,我們使用了 Arc (原子引用計數(shù))和 Mutex (互斥鎖)來實現(xiàn)線程安全的單例。通過 get_instance 方法,我們可以獲取到單例實例,并對實例進行操作。
use std::sync::{Arc, Mutex};
struct Singleton {
// 單例數(shù)據(jù)
data: String,
}
impl Singleton {
// 獲取單例實例的方法
fn get_instance() -> Arc<Mutex<Singleton>> {
// 使用懶加載創(chuàng)建單例實例
// 這里使用了 Arc 和 Mutex 來實現(xiàn)線程安全的單例
// 只有第一次調(diào)用 get_instance 時會創(chuàng)建實例,之后都會返回已創(chuàng)建的實例
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();
// 修改單例數(shù)據(jù)
{
let mut instance = instance1.lock().unwrap();
instance.data = String::from("Modified singleton instance");
}
// 輸出單例數(shù)據(jù)
{
let instance = instance2.lock().unwrap();
println!("{}", instance.data);
}
}
2. 使用lazy_static的懶加載
使用 lazy_static crate: lazy_static crate 是一個常用的 Rust crate,可以實現(xiàn)懶加載的全局靜態(tài)變量。通過 lazy_static ,可以在需要時創(chuàng)建單例實例,并確保只有一個實例被創(chuàng)建
use lazy_static::lazy_static;
use std::sync::Mutex;
struct Singleton {
// 單例數(shù)據(jù)
data: String,
}
lazy_static! {
static ref INSTANCE: Mutex<Singleton> = Mutex::new(Singleton {
data: String::from("Singleton instance"),
});
}
fn main() {
// 獲取單例實例
let instance = INSTANCE.lock().unwrap();
println!("{}", instance.data);
}
3. 使用once_cell crate
使用 once_cell crate: once_cell crate 是另一個常用的 Rust crate,可以實現(xiàn)懶加載的全局靜態(tài)變量。通過 once_cell ,可以在首次訪問時創(chuàng)建單例實例,并確保只有一個實例被創(chuàng)建文章來源:http://www.zghlxwxcb.cn/news/detail-633821.html
use once_cell::sync::Lazy;
struct Singleton {
// 單例數(shù)據(jù)
data: String,
}
static INSTANCE: Lazy<Singleton> = Lazy::new(|| Singleton {
data: String::from("Singleton instance"),
});
fn main() {
// 獲取單例實例
let instance = INSTANCE.clone();
println!("{}", instance.data);
}
4. 使用 Rc 和 RefCell
使用 Rc 和 RefCell : Rc 是 Rust 標準庫中的引用計數(shù)類型, RefCell 是一個提供內(nèi)部可變性的類型。結(jié)合使用 Rc 和 RefCell ,可以實現(xiàn)簡單的單例模式。示例代碼如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-633821.html
use std::rc::Rc;
use std::cell::RefCell;
struct Singleton {
// 單例數(shù)據(jù)
data: String,
}
fn main() {
// 創(chuàng)建單例實例
let instance = Rc::new(RefCell::new(Singleton {
data: String::from("Singleton instance"),
}));
// 獲取單例實例
let borrowed_instance = instance.borrow();
println!("{}", borrowed_instance.data);
}
到了這里,關(guān)于用Rust實現(xiàn)23種設(shè)計模式之單例的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!