Rust語言之GoF設計模式:靜態工廠

banq 發表於 2022-09-25
設計模式 Go

靜態建立方法是一個Rust 關聯函式 ,它返回一個新物件,該物件通常是該特定型別的例項。
在傳統的OO語言中如Java有一個“建構函式”的概念,它是建立物件的預設類方法。
但是在Rust中“建構函式”被丟棄,因為都可以使用用靜態建立方法實現。

猜猜這是什麼模式:

impl Circle {
    pub fn new(radius: u32) -> Circle {
        Self { radius }
    }
}

它就是靜態建立方法 (工廠方法的一個小親戚)

在典型的建構函式習語中,沒有辦法優雅地處理構造錯誤,構造程式碼的複雜性也存在限制。
但是,如果都使用靜態方式,則可以有任意數量的具有任何複雜邏輯的靜態方法,例如從資料庫載入。


有幾種方法可以定義靜態建立方法。

1、default():
來自 Default trait 的無引數構造方法。使用 default#[derive(Default)]或手動 trait 實現。

#[derive(Default)]
struct Circle;

let circle = Circle::default();


2. 帶有引數的自定義物件建立的手寫new()方法:

impl Rectangle {
    pub fn new(width: u32, length: u32) -> Rectangle {
        Self { width, length }
    }
}

let rectangle = Rectangle::new(10, 20);



3、from_
從自定義物件構造的字首方法(您可以使用任何名稱,但是,這是一種命名約定)。

let circle = Circle::from_shape(shape, 10, 20);


4. 實現From<>
實現已知型別構造trait:

impl From<PriceData> for FormattedData {
    fn from(price: PriceData) -> FormattedData {
        FormattedData {
            text: format!("{} {}", price.one, price.two),
        }
    }
}

let formatted_data = price_data.into();


原型模式:

#[derive(Clone)]
struct Rectangle {
    width, height: u32,
}

let rectangle1 = Rectangle::new(10, 20);
let mut rectangle2 = rectangle1.clone();
rectangle2.set_width(50);


它是一個原型,一種建立模式,允許您複製現有物件而不依賴於它們的型別。
Rust 有許多型別的標準Clone實現(透過#[derive(Clone)]),這使得 Prototype 易於使用且無縫。