最近在看 sidekiq-rs 这个库的源码时,发现了一个有趣的设计模式,就是私有构造函数模式。这个模式在 Rust 中非常有用,可以用来隐藏一些细节,同时也可以保证某些对象只能通过特定的方式来创建。代码大概是这样的:

#[derive(Clone)]
#[allow(clippy::manual_non_exhaustive)]
pub struct ProcessorConfig {
    pub num_workers: usize,
    _private: (),
}

impl ProcessorConfig {
    #[must_use]
    pub fn num_workers(mut self, num_workers: usize) -> Self {
        self.num_workers = num_workers;
        self
    }
}

impl Default for ProcessorConfig {
    fn default() -> Self {
        Self {
            num_workers: num_cpus::get(),
            _private: Default::default(),
        }
    }
}

因为增加了 _private 字段,所以不能再外部直接创建 ProcessConfig,只能通过 ProcessorConfig::default() 来创建,然后通过 nums_workers 方法来修改 num_workers 字段。