简单工厂模式 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); }