简单工厂模式 Simple factory
工厂 (factory), 在面向对象编程(OOP)中, 是用于创建其它对象的对象, 根据传入的不同参数, 而返回变化的对象. 这里的工厂, 可能是一个类, 然后这个类有一个工厂函数; 也可能只是一个独立的函数而已.
使用简单工厂, 创建具体的对象; 而使用者并不直接调用类的构造函数.
问题描述
装修房子时, 你需要一个木门. 你并不需要了解这个门是如何制造的, 你只需要把想要的门的尺寸告诉给制作门的 工厂, 然后他们就按要求生产木门了.
程序示例
#![deny(
warnings,
clippy::all,
clippy::cargo,
clippy::nursery,
clippy::pedantic
)]
/// 门的接口
pub trait Door {
fn width(&self) -> f32;
fn height(&self) -> f32;
}
/// 用于保存木门的内部属性, 它们不是 `pub` 的.
struct WoodenDoor {
width: f32,
height: f32,
}
impl WoodenDoor {
/// 木门的构造函数, 要注意, 它并不是 `pub` 的.
#[must_use]
#[inline]
const fn new(width: f32, height: f32) -> Self {
Self { width, height }
}
}
/// 为木门实现门的接口
impl Door for WoodenDoor {
#[inline]
fn width(&self) -> f32 {
self.width
}
#[inline]
fn height(&self) -> f32 {
self.height
}
}
/// 简单工厂函数, 它返回的是一个 trait object
#[must_use]
pub fn make_door(width: f32, height: f32) -> Box<dyn Door> {
Box::new(WoodenDoor::new(width, height))
}
fn main() {
// Make me a new door of 100x200
let door = make_door(100.0, 200.0);
println!("door.width: {}, height: {}", door.width(), door.height());
// Make me a door of 50x100
let _door2 = make_door(50.0, 100.0);
}