Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 锈织物图案,在hashmap中存储多个工厂_Design Patterns_Rust_Factory Pattern - Fatal编程技术网

Design patterns 锈织物图案,在hashmap中存储多个工厂

Design patterns 锈织物图案,在hashmap中存储多个工厂,design-patterns,rust,factory-pattern,Design Patterns,Rust,Factory Pattern,我希望能够在一个hashmap中存储多个工厂,以便以后将它们添加到hashmap中(例如通过插件),然后在应用程序中按键名获取每个工厂(这是一个资源管理器) 问题在于织物特性的通用性,织物可以创建不同类型的果实,但我需要在这里指定一些东西,例如HashMap或HashMap,这也没有什么用处,因为正如我所说,我们可以创建真正不同的果实 另外,我猜foo方法中可能有一个关于借用内容的问题 那么,您将如何实施这种“生锈方式” 使用std::collections::HashMap; 性状果实{ fn

我希望能够在一个hashmap中存储多个工厂,以便以后将它们添加到hashmap中(例如通过插件),然后在应用程序中按键名获取每个工厂(这是一个资源管理器)

问题在于织物特性的通用性,织物可以创建不同类型的果实,但我需要在这里指定一些东西,例如
HashMap
HashMap
,这也没有什么用处,因为正如我所说,我们可以创建真正不同的果实

另外,我猜foo方法中可能有一个关于借用内容的问题

那么,您将如何实施这种“生锈方式”

使用std::collections::HashMap;
性状果实{
fn get_name(&self)->字符串;
}
特色面料{
fn构建(和自)->框;
}
结构香蕉{}
香蕉水果{
fn get_name(&self)->String{String::from(“我是香蕉”)}
}
结构BananaFabric{}
用于Banana面料的impl面料{
fn构建(和自)->框{
盒子::新的(香蕉{})
}
}
结构苹果{}
苹果水果{
fn get_name(&self)->String{String::from(“我是苹果”)}
}
结构AppleFabric{}
AppleFabric的impl面料{
fn构建(和自)->框{
盒子::新的(苹果{})
}
}
结构C{
map:HashMap,
}
impl C{
pub fn new()->C{
C{
map:HashMap::new()
}
}
pub-fn-foo(&self,key:String){
匹配self.map.get(&key){
部分(&fabric)=>{
让水果=织物。构建();
println!(“{}”,fruit.get_name())
},
_=>println!(“未找到结构”)
}
}
}
fn main(){
设c=c::new();
c、 foo(字符串::from(“bar”);
}

你是说

使用std::collections::HashMap;
特征A{
fn boo(和self)->i32;
}
结构B{}
以A换B{
fn boo(和self)->i32{
15
}
}
结构C{
map:HashMap,
}
impl C{
pub fn new()->C{
C{
映射:HashMap::new(),
}
}
pub-fn-foo(&self,key:String){
匹配self.map.get(&key){
Some(val)=>println!(“{}”,val.boo()),
_=>println!(“无”),
}
}
}
fn main(){
让mut c=c::new();
c、 insert(String::from(“bar”),Box::new(B{});
c、 foo(字符串::from(“bar”);
}


顺便说一句,这是
工厂设计模式

我可以想到两种选择:

动态分派(特征对象)

trait Fabric {
  fn build(&self) -> Box<dyn Fruit>;
}

[...]

impl Fabric for BananaFabric  {
  fn build(&self) -> Box<dyn Fruit> {
    Box::new(Banana {})
  }
}
enum Fruits {
  Banana, 
  Apple
}
impl Fruit for Fruits {
  fn get_name(&self) -> String { 
    match self {
      Banana => String::from("I'm banana"),
      Apple => String::from("I'm apple"),
      _ => String::from("")
    }
  }
}

[...]

impl Fabric for BananaFabric  {
  fn build(&self) -> Box<Fruits> {
    Box::new(Fruits::Banana)
  }
}
在这两种情况下,
foo
方法如下所示:

pub fn foo(&self, key: String) {
  match self.map.get(&key) {
    Some(fabric) => {
      let fruit = fabric.build();
        println!("{}", fruit.get_name())
      },
      _ => println!("No fabric found")
  }
}

更改了一个代码示例以更好地描述我的问题。我希望现在更干净。我真的想拥有结构的hashmap。从模式匹配中删除引用可以解决复制问题,但我仍然不知道在hashmap类型声明中写什么。我真的很喜欢第一个解决方案,工作起来很有魅力!对于那些感兴趣并希望自己检查的人,我的最终代码在这里-
pub fn foo(&self, key: String) {
  match self.map.get(&key) {
    Some(fabric) => {
      let fruit = fabric.build();
        println!("{}", fruit.get_name())
      },
      _ => println!("No fabric found")
  }
}