Design patterns 锈织物图案,在hashmap中存储多个工厂
我希望能够在一个hashmap中存储多个工厂,以便以后将它们添加到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
,这也没有什么用处,因为正如我所说,我们可以创建真正不同的果实
另外,我猜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")
}
}