标准的工厂模式:struct/dyn trait
fn main() {
if let Some(x) = create_by_name("dog") {
x.speak();
}
}
trait Speakable {
fn speak(&self);
}
#[derive(Debug)]
struct Dog;
#[derive(Debug)]
struct Cat;
impl Speakable for Dog {
fn speak(&self) {
println!("{:?}:{:?}", self, "woof");
}
}
impl Speakable for Cat {
fn speak(&self) {
println!("{:?}:{:?}", self, "meow");
}
}
fn create_by_name(name: &str) -> Option<Box<dyn Speakable>> {
match name {
"cat" => Some(Box::new(Cat)),
"dog" => Some(Box::new(Dog)),
_ => None,
}
}
简单工厂模式:enum/option match
#![allow(warnings)]
fn main() {
let a = Animal::new("dog");
if let Some(d) = &a {
d.speak();
}
//map 用于转换,这里的副作用代码仅为演示
a.as_ref().map(|x| x.speak());
print!("{:?}", a);
}
#[derive(Debug)]
enum Animal {
Cat,
Dog,
}
impl Animal {
fn new(name: &str) -> Option<Animal> {
match name {
"cat" => Some(Self::Cat),
"dog" => Some(Self::Dog),
_ => None,
}
}
fn speak(&self) -> &Self {
match self {
Self::Cat => println!("meow"),
Self::Dog => println!("woof"),
}
self
}
}
浙公网安备 33010602011771号