最近我提出了动态创建对象的简单模式的想法。我真的很喜欢它。
我确信这个“轮子”是发明和命名的。有人可以指出一些GOF模式吗?
问题:有大量的对象我不希望在开始时全部初始化。所有都是一个班级的实例。
我想使用一个对象,然后释放内存(或允许垃圾回收),
每个对象都与某个字符串相关,所以我有一个地图({“str1”,obj1},{“str2”,obj2},...)
当请求带有str1时,我需要返回obj1,....
我可以(伪代码)
if(str == str1)
return new Obj(obj1_init_params);
else if(str == str2)
return new Obj(obj2_init_params);
...
然而,这是:
要解决1.你可以使用map:
map.put(str1, new Obj(obj1_init_params))
map.put(str2, new Obj(obj2_init_params))
然后:
map.get(str1)
这是快速解决方案,但不是按需创建的所有内容。所以....
创建一个包装器接口:
IWrapper {
Obj getObj();
}
然后我把它放在地图中:
map.put("str1", new IWrapper(){Obj getObj() {return new Object(object1_params)};
现在我在家:
这是如此简单,很好,有人以前命名过它。 我是java程序员,所以它在这里工作得很好。你能带来同样优雅的解决方案吗?
答案 0 :(得分:4)
编辑我最初将“what”与“how”混为一谈。
你取得了什么?一个lazy initialization。 如何你取得了它?通过Factory pattern(正如许多其他人已经写过的那样)。
更新您可以使用标准Callable
界面代替IWrapper
:
map.put(str, new Callable<Obj>() { Obj call() { return new Obj(str); } });
答案 1 :(得分:1)
这是工厂模式:http://en.wikipedia.org/wiki/Factory_pattern
工厂模式是一种创建设计模式,用于软件开发,以封装创建对象所涉及的过程。 对象的创建通常需要复杂的过程,这些过程不适合包含在合成对象中。
对象的创建可能导致代码严重重复,可能需要编写对象无法访问的信息,可能无法提供足够的抽象级别,或者可能不会成为编写对象关注的一部分。
创建对象所需的一些过程包括确定要创建的对象,管理对象的生命周期,以及管理对象的专门构建和拆除问题。
答案 2 :(得分:1)
正如其他人之前所说,这被称为“Factory pattern”。在为自己搞清楚方面做得很好。
如果您想更进一步,请创建一个仅包含类名(String)的映射。这允许您从文件中读取名称,最后得到“Inversion of Control”,这会导致“Dependency Injection”。
答案 3 :(得分:0)
这听起来有点像object factory。
答案 4 :(得分:0)
我记得很久以前写过关于工厂的CodeProject文章。你可以看看它:http://www.codeproject.com/KB/architecture/all_kinds_of_factories.aspx。
另外,不要过度。在http://discuss.joelonsoftware.com/default.asp?joel.3.219431.12上有一篇关于工厂制品的优秀文章,可以让你了解如何在抽象事物上走得太远。