标准的工厂模式: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
    }
}

 

posted on 2026-10-26 21:14  Freud  阅读(10)  评论(0)    收藏  举报