Rust语言之GoF设计模式:静态工厂


静态创建方法是一个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 易于使用且无缝。